我们有以下架构(为便于阅读而简化):
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;
我们的自动化测试会创建一个引用现有组的设备,然后尝试删除该组,该组由于默认的ON DELETE RESTRICT子句而失败:
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`))
但是,尽管存在外键约束,但大约25%的时间内,组的删除成功.这导致数据不一致,其中我们有一个设备行引用不存在的group_id.
> MySQL版本是5.7.10,运行官方Docker镜像
>表格是InnoDB
> FOREIGN_KEY_CHECKS设置为1
为什么外键约束的执行可能不一致?
解决方法:
标签:mysql
来源: https://codeday.me/bug/20190710/1429035.html