我们有以下架构(为便于阅读而简化):
CREATE TABLE `group` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `device` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `group_id` (`group_id`),
CONSTRAINT `device_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我们的自动化测试会创建引用现有device
的{{1}},然后尝试删除由于默认group
子句而失败的group
:
ON DELETE RESTRICT
然而,大约25%的时间,尽管存在外键约束,但Error 1451: Cannot delete or update a parent row: a foreign key constraint fails
(`device`, CONSTRAINT `device_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `group`
(`id`))
的删除仍然成功。这导致数据不一致,我们有一个引用group
的{{1}}行,但不存在。
为什么执行外键约束可能会不一致?