【问题标题】:Impossible MySQL insert ... select foreign key constraint error‽Impossible MySQL insert ...选择外键约束错误‽
【发布时间】:2016-07-07 14:29:56
【问题描述】:

这让我很困惑,希望有人能提供帮助。

查询:

insert into `shelter_pages` (`userid`,`relid`)
select :userid, `id` from `shelter` where `stage`='egg' order by rand() limit 30

简单吧?随机抽取 30 行满足条件,与用户 id 一起保存在“pages”表中。

错误:

SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(`db_name`.`shelter_pages`,CONSTRAINT `shelter_pages_ibfk_2` FOREIGN KEY (`relid`) REFERENCES `shelter` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

那怎么可能呢?它实际上是在SELECT 查询和INSERT 中获取这些`shelter`.`id` 值,外键检查怎么可能失败?

如果它有任何意义,那么有问题的桌子相当“忙碌”——它是游戏元素的一部分,任何玩家都可以从庇护所“领养”,从而删除该行。这就像我认为的原子操作中的竞争条件一样简单吗?

【问题讨论】:

  • 共享表结构。
  • 值得注意的是,错误是非常间歇性的,几乎百万分之一。
  • @Yuri 没有触发器。
  • 添加一些错误处理,这样当它失败时,您将获得失败的确切数据 - 然后您可以使用这些数据进行调试。它是零星错误的原因是因为它与数据相关并且您正在获取“随机”数据,因此只有当您随机选择使其失败的数据时才会发生错误。就是这样,调试时间:)
  • 你如何调试它完全取决于你 - 我试图说明的关键点是它看起来像数据错误,当它是零星的 - 所以如果想要解决它,你需要弄清楚哪些数据是问题所在。如何识别数据取决于您,但是当它不是用于生产目的的代码时,我个人会选择简单/最快的方式。如果是产品目的,则需要适当的事务控制等。

标签: mysql sql table-structure


【解决方案1】:

这很可能是因为您将transaction isolation level 设置为“脏读”(即READ UNCOMMITTED)。这意味着SELECT 可能正在读取未提交的数据,这些数据将在INSERT 期间使外键约束失败。

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 2023-03-13
    • 2018-02-15
    • 2012-01-16
    • 1970-01-01
    • 2014-04-08
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多