在 DELETE CASCADE 上,深度超过 15 级的自引用 MySQL 表失败

Posted

技术标签:

【中文标题】在 DELETE CASCADE 上,深度超过 15 级的自引用 MySQL 表失败【英文标题】:On DELETE CASCADE fails in self referencing MySQL table having depth more than 15 levels 【发布时间】:2014-11-13 17:23:16 【问题描述】:

我有一个带有自引用外键的 mysql 表。 ON DELETE CASCADE 在其中工作得非常好,但我注意到一个奇怪的行为,它对父实体最多只能工作 14 个级别。一旦我添加了第 15 级子级并尝试删除父级,它就会开始抛出错误

“无法删除或更新父行:外键约束失败”

这是层次结构的图像。

尝试删除 Parent 将引发错误。

在删除 Child15 时,可以删除 Parent 在不删除 Child15 的情况下,如果我尝试删除 Child1,则会成功删除。

重现该行为的示例架构是here。在 Build Schema 之前,用 id=1 而不是 id=2 粘贴这行查询

从表 1 中删除,其中 id=1;

我知道删除它的可能解决方法

SET FOREIGN_KEY_CHECKS=0 删除时自下而上移动

但我想知道这是 MySQL 对 ON CASCADE DELETE 的一些已知限制吗?

我正在使用 MySQL 服务器版本 5.6

【问题讨论】:

【参考方案1】:

这是记录在案的行为:

如果 ON UPDATE CASCADE 或 ON UPDATE SET NULL 递归更新相同 它以前在级联期间更新过的表,它的行为就像 严格。这意味着您不能在更新时使用自引用 CASCADE 或 ON UPDATE SET NULL 操作。这是为了防止无限 级联更新导致的循环。自引用 ON DELETE 另一方面,SET NULL 是可能的,就像自引用 ON 删除级联。 级联操作的嵌套不能超过 15 个 层次深。

来源:InnoDB and FOREIGN KEY Constraints, Referential Actions

【讨论】:

以上是关于在 DELETE CASCADE 上,深度超过 15 级的自引用 MySQL 表失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Mysql 上使用 ddl 模式生成时未生成 ON DELETE CASCADE 选项

删除 ON DELETE CASCADE

JPA orphanRemoval=true 与 ON DELETE CASCADE DML 子句有何不同

hibernate cascade

如何在 JPA 中获取外键引用以具有“ON UPDATE CASCADE ON DELETE CASCADE”功能?

是否支持 DELETE CASCADE?