mysql多次删除级联叶孤儿

时间:2016-06-22 12:33:38

标签: mysql sql many-to-many cascade orphan

世界!

当我在多对多关系中级联删除记录时,我有孤儿。这是我的sql代码(对于mysql):

DROP TABLE IF EXISTS skTable;
DROP TABLE IF EXISTS studentTable;
DROP TABLE IF EXISTS kTable;
DROP TABLE IF EXISTS classTable;

create table if not exists classTable (id int primary key) ENGINE=INNODB;
insert into classTable values(1);
insert into classTable values(2);

create table if not exists studentTable (id int primary key, classID int, CONSTRAINT FOREIGN KEY (classID) REFERENCES classTable(id) ON DELETE CASCADE)  ENGINE=INNODB;
insert into studentTable values(1, 1);
insert into studentTable values(2, 2);

create table if not exists kTable (id int primary key) ENGINE=INNODB;
insert into kTable values(1);
insert into kTable values(2);
insert into kTable values(3);

create table if not exists skTable (id int primary key, studentID int, CONSTRAINT FOREIGN KEY(studentID) REFERENCES studentTable(id) on delete cascade, kID int, CONSTRAINT FOREIGN KEY(kID) REFERENCES kTable(id) on delete cascade) ENGINE=INNODB;
insert into skTable values(1,1,1);
insert into skTable values(2,2,2);
insert into skTable values(3,2,3);
insert into skTable values(4,1,2);

DELETE FROM classTable WHERE id=2;

我的期望是得到这些记录:

classTable,1条记录:

    id=1

studentTable,1条记录:

    id=1, classID=1

kTable,2条记录:

    id=1
    id=2

skTable,2条记录:

    id=1, studentID=1, kID=1
    id=4, studentID=1, kID=2

问题是最后kTable有额外的记录

    id=3

是孤儿。

有什么想法吗? 谢谢。 →

1 个答案:

答案 0 :(得分:0)

在您的示例中,skTablestudentTablekTable的孩子。 studentTableclassTable的孩子。 对于FORENgn键ON DELETE CASCADE,如果在父级中删除,则子表数据将被删除。但反之亦然是不可能的。这就是为什么当您删除classTable中的数据时,studentTable数据会被删除,并且由于studentTable中的数据删除,skTable数据会被删除但不会kTable数据