MySql 从 2 个表中级联删除
MySql cascade delete from 2 tables
我有一个使用 class table inheritance 的 MySql 模式,但我希望子 table 从父 table 和外部 table 级联删除=18=].
create table parent (
_key bigint unsigned not null,
name varchar(64) unique not null,
primary key(_key)
);
create table child_a (
_key bigint unsigned not null,
foreign_key_a bigint unsigned not null,
foreign key(_key) references parent(_key) on delete cascade,
foreign key(foreign_key_a) references a(_key) on delete cascade,
primary key(_key)
);
create table child_b (
_key bigint unsigned not null,
foreign_key_b bigint unsigned not null,
foreign key(_key) references parent(_key) on delete cascade,
foreign key(foreign_key_b) references b(_key) on delete cascade,
primary key(_key)
);
问题是当从其中一个外部 table 中删除记录时,它会从子 table 中删除记录,但不会从父 table 中删除记录。我不想使用存储过程/多语句作为解决方案,因为外部 tables 有自己的级联删除,所以我也需要这些存储过程。
ON DELETE CASCADE
将删除 table 中带有外键(子)的行,当 table 中引用(父)的行被删除时。如果没有 ON DELETE CASCADE
,带有外键(子)的行将指向不再存在的行(父),您将得到一个 INTEGRITY CONSTRAINT VIOLATION
.
反之则没有这样的问题,删除子项而不删除父项不会留下孤立行,就 MySQL 而言也没有 INTEGRITY CONSTRAINT VIOLATION
,也不需要级联。
如果您希望同时删除子行、父行和其他引用的行,您有几个选择。
Multistatement/Procedure:
- 先删除子记录,然后删除父记录,然后再删除其他记录(不需要
ON DELETE CASCADE
s)
- 先删除子记录,然后删除其他记录,最后删除父记录(不需要
ON DELETE CASCADE
s)
- 先删除父记录,再删除其他记录(只需要
ON DELETE CASCADE
对父引用)
- 先删除其他记录再删除父记录(只需要
ON DELETE CASCADE
其他参考)
触发器:
- 在子 table 的
AFTER DELETE
上放置一个触发器,删除父记录和另一条记录(以任一顺序),然后删除子将清除所有三个记录(不需要ON DELETE CASCADE
s)
改变关系:
- 如果您可以更改与另一个 table(a 或 b)的关系,以便它引用子项而不是引用另一个 table 的子项(如您目前所做的那样),并且保留
ON DELETE CASCADE
s,删除父行将清除子项,然后依次清除其他记录。
我有一个使用 class table inheritance 的 MySql 模式,但我希望子 table 从父 table 和外部 table 级联删除=18=].
create table parent (
_key bigint unsigned not null,
name varchar(64) unique not null,
primary key(_key)
);
create table child_a (
_key bigint unsigned not null,
foreign_key_a bigint unsigned not null,
foreign key(_key) references parent(_key) on delete cascade,
foreign key(foreign_key_a) references a(_key) on delete cascade,
primary key(_key)
);
create table child_b (
_key bigint unsigned not null,
foreign_key_b bigint unsigned not null,
foreign key(_key) references parent(_key) on delete cascade,
foreign key(foreign_key_b) references b(_key) on delete cascade,
primary key(_key)
);
问题是当从其中一个外部 table 中删除记录时,它会从子 table 中删除记录,但不会从父 table 中删除记录。我不想使用存储过程/多语句作为解决方案,因为外部 tables 有自己的级联删除,所以我也需要这些存储过程。
ON DELETE CASCADE
将删除 table 中带有外键(子)的行,当 table 中引用(父)的行被删除时。如果没有 ON DELETE CASCADE
,带有外键(子)的行将指向不再存在的行(父),您将得到一个 INTEGRITY CONSTRAINT VIOLATION
.
反之则没有这样的问题,删除子项而不删除父项不会留下孤立行,就 MySQL 而言也没有 INTEGRITY CONSTRAINT VIOLATION
,也不需要级联。
如果您希望同时删除子行、父行和其他引用的行,您有几个选择。
Multistatement/Procedure:
- 先删除子记录,然后删除父记录,然后再删除其他记录(不需要
ON DELETE CASCADE
s) - 先删除子记录,然后删除其他记录,最后删除父记录(不需要
ON DELETE CASCADE
s) - 先删除父记录,再删除其他记录(只需要
ON DELETE CASCADE
对父引用) - 先删除其他记录再删除父记录(只需要
ON DELETE CASCADE
其他参考)
触发器:
- 在子 table 的
AFTER DELETE
上放置一个触发器,删除父记录和另一条记录(以任一顺序),然后删除子将清除所有三个记录(不需要ON DELETE CASCADE
s)
改变关系:
- 如果您可以更改与另一个 table(a 或 b)的关系,以便它引用子项而不是引用另一个 table 的子项(如您目前所做的那样),并且保留
ON DELETE CASCADE
s,删除父行将清除子项,然后依次清除其他记录。