问题: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 CASCADEs不需要)

  • 先删除子记录,再删除其他记录,再删除父记录(ON DELETE CASCADEs不需要)

  • 先删除父记录,再删除其他记录(只需要父引用上的ON DELETE CASCADE)

  • 先删除另一条记录再删除父项(只需要另一条引用上的ON DELETE CASCADE)

扳机:

  • 在子表的AFTER DELETE上放置一个触发器,删除父表和另一条记录(以任意顺序),然后删除子表将清除所有三个记录(不需要ON DELETE CASCADEs)

改变关系:

  • 如果您可以更改与另一个表(a 或 b)的关系,使其引用子表而不是引用另一个表的子表(如您目前所拥有的),并保留ON DELETE CASCADEs,删除父行将清除子表然后是另一条记录。
Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐