【发布时间】: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