MySQL - ON DELETE CASCADE



MySQL ON DELETE CASCADE 約束

MySQL 的ON DELETE CASCADE約束確保當父表中的一行被刪除時,子表中所有相關的行也會被自動刪除。此約束有助於維護透過外部索引鍵關係連線的兩個表之間的參照完整性。

如果不使用此約束,資料庫伺服器預設情況下會阻止我們刪除表中的資料,如果這些資料被其他表引用。

示例

建立父表 -

首先,讓我們使用以下查詢建立名為PERSONS的父表 -

CREATE TABLE PERSONS(
   P_ID int primary key,
   P_NAME varchar(40),
   P_AGE int
);

現在,讓我們使用如下所示的 INSERT 語句將一些值插入到上面建立的表中 -

INSERT INTO PERSONS VALUES 
(1, "Priya", 29),
(2, "Sarah", 20),
(3, "Varun", 26),
(4, "Dev", 25),
(5, "Ram", 31),
(6, "Aarohi", 34);

獲得的 PERSONS 表如下所示 -

P_ID P_NAME P_AGE
1 Priya 29
2 Sarah 20
3 Varun 26
4 Dev 25
5 Ram 31
6 Aarohi 34

建立子表 -

現在,讓我們建立一個名為 Films_watched 的子表,並使用 ON DELETE CASCADE 約束。在這個表中,P_ID 列是引用 Persons 表中 P_ID 列的外部索引鍵 -

CREATE TABLE Films_watched (
   P_ID INT,
   F_NO INT,
   F_NAME varchar(40),
   PRIMARY KEY(P_ID,F_NO),
   FOREIGN KEY(P_ID)
   REFERENCES PERSONS(P_ID)
   ON DELETE CASCADE
);

現在,我們將行插入到 Films_watched 表中 -

INSERT INTO Films_watched VALUES 
(1, 130, "RRR"),
(2, 131, "Bahubali"),
(3, 132, "Pushpa"),
(3, 133, "KGF"),
(3, 134, "Salaar"),
(6, 135, "Karthikeya");

生成的 Films_watched 表如下所示 -

P_ID F_NO F_NAME
1 130 RRR
2 131 Bahubali
3 132 Pushpa
3 133 KGF
3 134 Salaar
6 135 Karthikeya

從父表中刪除記錄 -

正如我們在上表中看到的,我們有三個電影是由 P_ID = 3 的人觀看的。在這裡,我們將從 PERSONS(父)表中刪除 P_ID = 3 的人 -

DELETE FROM PERSONS WHERE P_ID = 3;

以下是獲得的輸出 -

Query OK, 1 row affected (0.01 sec)

刪除後,讓我們檢查 Persons 和 Films_watched 表中的資料。

從 Persons 表查詢資料 -

要檢視 Persons 表中剩餘的記錄,請使用以下 SELECT 查詢 -

SELECT * FROM PERSONS;

我們可以在下表中看到,P_ID = 3 的行已被刪除 -

P_ID P_NAME P_AGE
1 Priya 29
2 Sarah 20
4 Dev 25
5 Ram 31
6 Aarohi 34

從 Films_watched 表查詢資料 -

最後,您可以檢查 Films_watched 表中的資料 -

SELECT * FROM Films_watched;

輸出

我們可以在下面的輸出中看到,所有與 P_ID = 3 相關的記錄都已被自動刪除 -

P_ID F_NO F_NAME
1 130 RRR
2 131 Bahubali
6 135 Karthikeya
廣告