对外键约束的不一致尊重

时间:2016-12-14 16:08:02

标签: mysql

我们有以下架构(为便于阅读而简化):

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}}行,但不存在。

  • MySQL版本为5.7.10,运行官方Docker镜像
  • 表格是InnoDB
  • FOREIGN_KEY_CHECKS设置为1

为什么执行外键约束可能会不一致?

1 个答案:

答案 0 :(得分:0)

这是由测试夹具库(https://github.com/go-testfixtures/testfixtures)导致的,该库禁用了外键检查