Я пытаюсь узнать, есть ли способ проверить ссылочную целостность одной строки после того, как она была вставлена в таблицу 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, из-за которой фикстуры с прямыми ссылками не могут быть загружены. Предлагаемое решение - отключить проверку внешнего ключа при загрузке фикстур и повторно включить их после завершения загрузки. Я пытаюсь выяснить, как в этот момент вернуться и проверить ссылочную целостность строк, которые были добавлены, когда проверки внешнего ключа были отключены, и вызвать ошибку, если есть проблема.)