我正在尝试查看是否有一种方法可以在将单行插入 InnoDB 表foreign_key_checks
且设置为 0 后检查其引用完整性。
所以给定两个表:
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`author_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `book_cc846901` (`author_id`),
CONSTRAINT `author_id_refs_id_7fdd0933` FOREIGN KEY (`author_id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
我们对它们运行以下语句:
SET foreign_key_checks=0
INSERT INTO `book` (`id`, `name`, `author_id`) VALUES (1, 'Cryptonomicon', 3)
INSERT INTO `person` (`id`, `name`) VALUES (4, 'Neal Stephenson')
SET foreign_key_checks=1
所以我们在这里放了一些不好的数据——author_id 指的是不存在的 person.id 3。我试图找到一种方法来触发对该行的某种检查,如果存在参考问题,这将引发错误像这个。
我最初尝试采用的方法是使用完全相同的数据更新行。我试过这个:
UPDATE `book` SET `name` = 'Cryptonomicon', `author_id` = 3 WHERE `book`.`id` = 1
我预计这会触发一个错误——但是,它没有。由于数据没有改变,显然没有进行完整性检查?例如,将 author_id 设置为 2确实会失败。
那么我的问题是:是否有替代方法可以让我检查给定的行并在出现问题时触发完整性错误?我已经用谷歌搜索了,但我什么也没找到。我想避免检查整个表格,但这可能是唯一的途径。
任何使我无法理解的见解或其他方法将不胜感激。
(如果你好奇我为什么要这样做,那是因为我试图帮助解决 Django 框架中的一个未解决问题,即无法加载具有前向引用的固定装置。建议的解决方案是禁用外键检查当加载完成后加载并重新启用固定装置时.我试图弄清楚如何返回并检查在外键检查关闭时添加的行的引用完整性并引发有问题就报错。)