如果在mysql中删除父行,如何自动删除所有引用行?

Posted

技术标签:

【中文标题】如果在mysql中删除父行,如何自动删除所有引用行?【英文标题】:How to delete automatically all reference rows if parent row get deleted in mysql? 【发布时间】:2014-02-13 14:25:02 【问题描述】:

我有一个包含大约 50 个表的数据库。

假设我有一个名为 parent 的表,其 id 主键和 24 个大约参考此父表的子表。

我没有使用删除级联。 我已经搜索过关于连接可以在所有子表中执行删除。但是加入 20-30 张桌子?太多了。

如果父级被删除,请告诉我是否有任何其他解决方案可以删除所有这些子行。

【问题讨论】:

那么,为什么不使用“on delete cascade”呢?如果 FK 就位,那么在没有级联规则的情况下甚至都无法删除:因为听起来没有错误,所以 FK 关系仍然没有正确设置,应该首先完成(并包括级联 while更新架构)。 【参考方案1】:

您可以使用 ON DELETE CASCADE

ALTER TABLE childTable
  ADD CONSTRAINT `FK_key` FOREIGN KEY (`childColumnName`) 
  REFERENCES parentTable(`parentColumnName`) ON UPDATE CASCADE ON DELETE CASCADE

父表上创建AFTER DELETE TRIGGER。添加子表的 DELETE 查询。

DELIMITER $$

CREATE
    TRIGGER `tn_aur_department_master` AFTER DELETE ON `tn_parentTable` 
    FOR EACH ROW BEGIN
        DELETE FROM childTable WHERE parentId = old.parentId;
    END;
$$

DELIMITER ;

【讨论】:

我已经说过我有 20 到 30 个子表用于父表,所以我不能每个都去改变。有没有其他可能的方法来做到这一点。触发方法也很有帮助,但我必须再次为此编写 20-30 条删除语句。 @AamirSohail:那么为所涉及的表编写alter table once 有什么问题?从长远来看,任何其他解决方案都会做得更多。

以上是关于如果在mysql中删除父行,如何自动删除所有引用行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从mysql5中的父表中删除数据?

根据之前删除的子行删除父行

TypeORM/MySQL:无法删除或更新父行:外键约束失败

knexjs使用事务从父/子表中删除行

MySQL:错误 1217 (23000):无法删除或更新父行:外键约束失败 - 但仅适用于 1 个 sql 文件

无法删除表:外键约束失败