在 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 选项
JPA orphanRemoval=true 与 ON DELETE CASCADE DML 子句有何不同