gpt4 book ai didi

MySql 级联删除 2 个表

转载 作者:可可西里 更新时间:2023-11-01 06:32:33 27 4
gpt4 key购买 nike

我有一个使用 class table inheritance 的 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)
  • 先删除子记录,然后删除其他记录,最后删除父记录(不需要ON DELETE CASCADE)
  • 先删除父记录,再删除其他记录(只需要父引用上的ON DELETE CASCADE)
  • 先删除其他记录,然后删除父记录(只需要在其他引用上使用 ON DELETE CASCADE)

触发器:

  • 在删除父记录和其他记录(以任一顺序)的子表上的 AFTER DELETE 上放置触发器,然后删除子表将清除所有三个记录(不需要 关于删除级联s)

改变关系:

  • 如果您可以更改与其他表(a 或 b)的关系,以便它引用子表而不是引用其他表的子表(如您当前所用),并保留 ON DELETE CASCADEs,删除父行会清除子行,然后依次清除其他记录。

关于MySql 级联删除 2 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36064588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com