演示表中參照完整性中刪除異常的SQL查詢


簡介

SQL 查詢是從資料庫請求資料的請求。在演示具有參照完整性的表中刪除異常的上下文中,SQL 查詢將用於從父表中刪除記錄並觀察對子表中相關記錄的影響。

為了演示刪除異常,我們可以建立兩個具有外部索引鍵約束的表,插入一些示例資料,然後使用 `DELETE` 語句從父表中刪除記錄。然後,我們可以使用 `SELECT` 語句檢索子表中的資料,並觀察由於刪除操作而發生的任何更改。這將顯示參照完整性不足如何導致刪除異常。

定義

在資料庫中,參照完整性是一種確保表之間關係始終保持一致的屬性。這意味著,如果刪除了父表中的一條記錄(例如客戶),則子表中任何相關的記錄(例如該客戶下的訂單)也應被刪除。

但是,如果未正確設定外部索引鍵約束,則可能會發生刪除異常。當刪除父表中的一條記錄時,會發生刪除異常,結果,子表中的相關記錄成為“孤兒”記錄,並且無法再訪問。這可能會導致資料完整性問題,並可能導致資料庫不一致。

示例 1

以下是如何演示具有參照完整性的表中刪除異常的示例。

SQL 查詢

  • 建立兩個表,`customers` 和 `orders`,在 `orders` 表的 `customer_id` 欄位上設定外部索引鍵約束,該欄位引用 `customers` 表的 `id` 欄位。

CREATE TABLE customers ( id INTEGER PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE orders ( id INTEGER PRIMARY KEY, customer_id INTEGER NOT NULL, product TEXT NOT NULL, FOREIGN KEY (customer_id) REFERENCES customers(id) );
  • 將一些示例資料插入 `customers` 和 `orders` 表中。

INSERT INTO customers (id, name) VALUES (1, 'Alice'); INSERT INTO customers (id, name) VALUES (2, 'Bob'); INSERT INTO orders (id, customer_id, product) VALUES (1, 1, 'Widget'); INSERT INTO orders (id, customer_id, product) VALUES (2, 1, 'Gadget'); INSERT INTO orders (id, customer_id, product) VALUES (3, 2, 'Thingamajig');
  • 從 `customers` 表中刪除一條記錄,並觀察對 `orders` 表中相關記錄的影響。

DELETE FROM customers WHERE id = 1;
SELECT * FROM orders;

結果輸出將顯示 id 為 1(Alice)的客戶下的訂單也被刪除了,這演示了由於缺乏參照完整性而導致的刪除異常。

為了避免此問題,您可以使用 `ON DELETE CASCADE` 選項設定外部索引鍵約束,當從父表中刪除記錄時,這將自動刪除子表中的任何相關記錄。

示例 2

為了演示學生表中具有參照完整性的刪除異常,您可以按照以下步驟操作:

SQL 查詢

  • 建立兩個表,`students` 和 `enrollments`,在 `enrollments` 表的 `student_id` 欄位上設定外部索引鍵約束,該欄位引用 `students` 表的 `id` 欄位。

CREATE TABLE students ( id INTEGER PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE enrollments ( id INTEGER PRIMARY KEY, student_id INTEGER NOT NULL, course_id INTEGER NOT NULL, FOREIGN KEY (student_id) REFERENCES students(id) );
  • 將一些示例資料插入 `students` 和 `enrollments` 表中。

INSERT INTO students (id, name) VALUES (1, 'Alice'); INSERT INTO students (id, name) VALUES (2, 'Bob'); INSERT INTO enrollments (id, student_id, course_id) VALUES (1, 1, 101); INSERT INTO enrollments (id, student_id, course_id) VALUES (2, 1, 102); INSERT INTO enrollments (id, student_id, course_id) VALUES (3, 2, 103);
  • 從 `students` 表中刪除一條記錄,並觀察對 `enrollments` 表中相關記錄的影響。

DELETE FROM students WHERE id = 1;
SELECT * FROM enrollments;

結果輸出將顯示 id 為 1(Alice)的學生的註冊資訊也被刪除了,這演示了由於缺乏參照完整性而導致的刪除異常。

為了避免此問題,您可以使用 `ON DELETE CASCADE` 選項設定外部索引鍵約束,當從父表中刪除記錄時,這將自動刪除子表中的任何相關記錄。

結論

當刪除父表中的一條記錄時,並且結果子表中的相關記錄成為“孤兒”記錄並且無法訪問時,在具有參照完整性的資料庫表中可能會發生刪除異常。

更新於:2023年1月27日

瀏覽量:321

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告