我有一个使用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)
);
问题是当从其中一个外表删除记录时,它将从子表中删除记录,但不从父表中删除。我不想使用存储过程/多语句作为解决方案,因为外表有自己的级联删除,所以我也需要存储过程。
答案 0 :(得分:11)
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 )改变关系:
ON DELETE CASCADE
,删除父行将依次清除子项,然后清除另一个记录。