我已经MySQL Server 5.1.62
安装在生产服务器上。我每天都在监控 mysql 服务器的错误日志文件,突然我在错误日志文件中发现了以下错误。
InnoDB:无法删除/更新具有超过最大深度 250 的级联外键约束的行
请删除过多的外键并重试
我有一个带有主键的数据库结构 - 具有适当更新/删除操作的外键关系,如果父表中的数据被应用程序或手动(后端)删除,我需要删除子表的数据。
我已经用谷歌搜索了这个问题,但我找不到合适的解决方案。我该如何解决这个问题?
我已经MySQL Server 5.1.62
安装在生产服务器上。我每天都在监控 mysql 服务器的错误日志文件,突然我在错误日志文件中发现了以下错误。
InnoDB:无法删除/更新具有超过最大深度 250 的级联外键约束的行
请删除过多的外键并重试
我有一个带有主键的数据库结构 - 具有适当更新/删除操作的外键关系,如果父表中的数据被应用程序或手动(后端)删除,我需要删除子表的数据。
我已经用谷歌搜索了这个问题,但我找不到合适的解决方案。我该如何解决这个问题?
模式的图片不是很有用,因为它没有显示任何级联声明。例如,如果删除应该从 tbl_indentmaster 级联到 tbl_tepdetails,但删除不应该从 tbl_tepdetails 级联到 tbl_tepnoting,那么我预计某些删除会失败。(但有不同的错误消息。)
如果存在导致这种情况的循环引用约束,我希望它部分是由从 tbl_indentmaster 到 tbl_tepdetails 的级联引用引起的。您可能想尝试删除该外键约束以进行测试。在 tset sserver 上执行此操作,而不是在生产服务器上。
如果这突然开始,并且您的数据库之前正常工作,我会首先考虑
我假设您没有良好的备份,并且您的架构不受版本控制。
你是从一个好的数据库开始的吗?运行mysqlcheck。仔细阅读该文档。--repair
在您拥有经过测试的良好备份之前不要这样做。
假设你的数据库很好,级联删除应该在你的数据库中正常工作,并且你的谷歌技能很好,我认为你最好的开始是
要将数据库加载到测试服务器上,请使用mysqldump转储内容。不要在文件系统级别复制文件——其中一个或多个可能已损坏。
虽然这可能无法解决您的问题,但它可能会告诉您问题的确切位置。如果它工作正常,您就知道问题可能与服务器版本有关,并且可以通过版本升级来解决。
看看这个链接 -级联删除导致 "Got error -1 from storage engine"。有一个建议。
此外,作为一种解决方案,您可以尝试在没有ON DELETE CASCADE选项的情况下执行此操作,只需使用从某些表中删除记录的DELETE语句(多表语法)。
我同意@Devart 和@Catcall 的原始答案,但我想在与 OP 交换一些评论后添加一些内容。
DELETE
首先,我将模式图像表示减少为仅受tbl_indentmaster
.
据我所知,此架构图中没有循环 FK 引用。
此外,OP 运行了以下查询:
DELETE FROM tbl_indentmaster WHERE indentId IN (1,2,3,4,5,6,...,150,151,155,156,....)
要删除的行太多了。在进一步询问时,OP 声称该查询适用于indentId
's 的较小子集。
由此我认为我们可以采取两种可能性:
CASCADE DELETE
像您这样的大型查询失败。请注意,我建议可能存在一个新错误,而不是[已发布][2]。理想情况下,要删除的行数应该无关紧要。indentId
条目tbl_indentmaster
导致整个查询失败。我建议您首先尝试诊断问题,考虑到第 (2) 点是真正的罪魁祸首。您可以将DELETE
查询分成更小的块并找到有问题的 id。
如果此脚本必须通过代码定期执行(在较大的应用程序中),那么您应该考虑在那里以较小的块执行查询(可能每个查询 15 个 id 是一个好的开始 IMO)。除了这样做之外,我还建议在日志文件中记录带有违规 id 的错误,以便您确切知道哪些条目失败了。