演示表中參照完整性中刪除異常的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` 選項設定外部索引鍵約束,當從父表中刪除記錄時,這將自動刪除子表中的任何相關記錄。
結論
當刪除父表中的一條記錄時,並且結果子表中的相關記錄成為“孤兒”記錄並且無法訪問時,在具有參照完整性的資料庫表中可能會發生刪除異常。