MySql级联删除2个表
·
问题:MySql级联删除2个表
我有一个 MySql 模式,它使用类表继承,但我希望子表从父表和外部表中级联删除。
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)
);
问题是当从一个外部表中删除一条记录时,它会从子表中删除该记录,但不会从父表中删除。我不想使用存储过程/多语句作为解决方案,因为外部表有自己的级联删除,所以我也需要存储过程。
解答
ON DELETE CASCADE
将在其引用的表(父)中的行被删除时,删除具有外键(子)的表中的行。如果没有ON DELETE CASCADE
,具有外键(子)的行将指向不再存在的行(父),您将获得INTEGRITY CONSTRAINT VIOLATION
。
反过来就没有这样的问题,就 MySQL 而言,在不删除父级的情况下删除子级不会留下孤立行和INTEGRITY CONSTRAINT VIOLATION
并且不需要级联。
如果您想一起删除子、父和其他引用的行,您有几个选项。
多语句/程序:
-
先删除子记录,再删除父记录,再删除其他记录(
ON DELETE CASCADE
s不需要) -
先删除子记录,再删除其他记录,再删除父记录(
ON DELETE CASCADE
s不需要) -
先删除父记录,再删除其他记录(只需要父引用上的
ON DELETE CASCADE
) -
先删除另一条记录再删除父项(只需要另一条引用上的
ON DELETE CASCADE
)
扳机:
- 在子表的
AFTER DELETE
上放置一个触发器,删除父表和另一条记录(以任意顺序),然后删除子表将清除所有三个记录(不需要ON DELETE CASCADE
s)
改变关系:
- 如果您可以更改与另一个表(a 或 b)的关系,使其引用子表而不是引用另一个表的子表(如您目前所拥有的),并保留
ON DELETE CASCADE
s,删除父行将清除子表然后是另一条记录。
更多推荐
所有评论(0)