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

时间:2014-09-19 07:18:54

标签: mysql foreign-keys cascading-deletes self-reference

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

  

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

以下是层次结构的图像。

enter image description here

尝试删除Parent会抛出错误。

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

重现行为的示例模式为here。在构建架构之前,使用id = 1而不是id = 2

粘贴此查询行
  

DELETE FROM table1 WHERE id = 1;

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

  • SET FOREIGN_KEY_CHECKS = 0
  • 删除时自下而上

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

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

1 个答案:

答案 0 :(得分:6)

这是记录在案的行为:

  

如果ON UPDATE CASCADE或ON UPDATE SET NULL递归更新相同   在级联期间它先前更新过的表,它的作用就像   限制。这意味着您不能使用自引用ON UPDATE   CASCADE或ON UPDATE SET NULL操作。这是为了防止无限   级联更新产生的循环。一个自引用的ON DELETE   另一方面,SET NULL是可能的,因为是自参考ON   删除CASCADE。 级联操作的嵌套次数可能不超过15次   水平很深。

来源:InnoDB and FOREIGN KEY Constraints, Referential Actions