MySQL - 级联删除
MySQL 级联删除约束
MySQL 的 级联删除 约束确保当父表中的一行被删除时,子表中所有相关的行也会被自动删除。此约束有助于维护通过外键关系连接的两个表之间的引用完整性。
如果不使用此约束,数据库服务器将默认阻止我们删除被其他表引用的表中的数据。
示例
创建父表 −
首先,我们使用以下查询创建名为 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 |