不可能MySQL插入...select外键约束错误‽

Impossible MySQL insert ... select foreign key constraint error‽

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

查询:

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

很简单吧?随机取30条满足条件的行,和用户id一起保存在"pages"table中

错误:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`db_name`.`shelter_pages`, CONSTRAINT `shelter_pages_ibfk_2` FOREIGN KEY (`relid`) REFERENCES `shelter` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

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

如果它有任何意义的话,table 是相当 "busy" - 它是游戏元素的一部分,任何玩家都可以 "adopt" 从避难所,从而删除排。这是否像我认为的原子操作中的竞争条件一样简单?

这很可能发生,因为您将 transaction isolation level 设置为 "dirty read"(即 READ UNCOMMITTED)。这意味着 SELECT 可能正在读取未提交的数据,这些数据在 INSERT.

期间会导致外键约束失败