MySQL:超出最大深度的外键约束

Sah*_*hah 12 mysql foreign-keys cascading-deletes sql-delete

我已经MySQL Server 5.1.62安装在生产服务器上.我每天都在监视mysql服务器的错误日志文件,突然间我在错误日志文件中发现了以下错误.

InnoDB:无法删除/更新超过最大深度250的级联外键约束的行
请减少过多的外部约束并再试一次

我有一个带有主键的数据库结构-具有正确更新/删除操作的外键关系,如果父表中的数据被应用程序删除或手动(后端),我需要删除子表的数据.

我用谷歌搜索了这个问题,但我找不到合适的解决方案.我该如何解决这个问题?

Tan*_*azi 1

我同意@Devart 和@Catcall 的原始答案,但我想在与OP 交换一些评论后添加一些内容。

首先,我将架构图像表示减少为仅DELETEtbl_indentmaster.

据我所知,此模式图中没有循环 FK 引用。

此外,OP 运行了以下查询:

DELETE FROM tbl_indentmaster WHERE indentId IN (1,2,3,4,5,6,...,150,151,155,156,....)
Run Code Online (Sandbox Code Playgroud)

要删除的行数量非常多。在进一步询问时,OP 声称该查询适用于 的较小indentId子集。

由此我想我们可以有两种可能:

  1. MySQL 中存在一个错误(极不可能但有可能),它会导致CASCADE DELETE像您这样的大型查询失败。请注意,我建议可能存在新的错误,而不是[已发布][2]。理想情况下,要删除的行数应该不重要
  2. 其中有一个特定indentId条目tbl_indentmaster导致整个查询失败。

我建议您首先尝试诊断问题,考虑到第 (2) 点是真正的罪魁祸首。您可以将DELETE查询分成更小的块并找到有问题的 ID。

如果这个脚本必须通过代码定期执行(在较大的应用程序中),那么您应该考虑以较小的块执行查询(在我看来,每个查询可能有 15 个 id 是一个好的开始)。除了这样做之外,我建议在日志文件中记录带有违规 ID 的错误,以便您准确地知道哪些条目失败。