В MySQL я могу отложить проверки ссылочной целостности до фиксации - PullRequest
48 голосов
/ 16 февраля 2011

Как и в этом вопросе , я читал PoEAA и спрашивал себя, возможно ли отложить проверку ссылочной целостности до фиксации в MySQL.

Я столкнулся с этой проблемой, когда хотел вставить несколько продуктов и связанных продуктов в один и тот же коммит. Даже в транзакции я получаю ошибки ограничения при попытке вставить в таблицу соединения related_products.

Если это поможет, я использую PHP PDO для соединений с базой данных.

Буду признателен за любую помощь, которую вы можете предложить.

Ответы [ 3 ]

62 голосов
/ 16 февраля 2011

Похоже, мой ответ здесь ...

Как и MySQL в целом, в операторе SQL, который вставляет, удаляет или обновляет много строк, InnoDB проверяет UNIQUE иFOREIGN KEY ограничивает строку за строкой.При выполнении проверок внешнего ключа InnoDB устанавливает общие блокировки на уровне строк для дочерних или родительских записей, которые он должен просматривать. InnoDB немедленно проверяет ограничения внешнего ключа;проверка не откладывается до фиксации транзакции. В соответствии со стандартом SQL поведение по умолчанию должно быть отложенной проверкой.То есть ограничения проверяются только после обработки всего оператора SQL.Пока InnoDB не реализует отложенную проверку ограничений, некоторые вещи будут невозможны, например, удаление записи, которая ссылается на себя с использованием внешнего ключа.

Назад к чертежной доске.

14 голосов
/ 16 февраля 2011

Если вы спрашиваете, поддерживает ли MySQL атрибут DEFERRABLE для внешних ключей (включая опцию INITIALLY DEFERRED), тогда ответом будет явное нет.

Вы не можете отложить проверку ограничений до времени фиксациив MySQL.

И - как вы уже указали - они всегда оцениваются на "уровне строк", а не на "уровне операторов".

10 голосов
/ 30 апреля 2012

Вы можете справиться с этим ограничением механизма innodb, временно отключив проверку внешнего ключа, установив переменную сервера:

set foreign_key_checks=0;

Из руководства MySQL:

mysqldump также производит правильные определения таблиц вфайл дампа, и не забывает о внешних ключах.

Чтобы упростить перезагрузку файлов дампа для таблиц, имеющих отношения по внешнему ключу, mysqldump автоматически включает инструкцию в вывод дампа, чтобы установить foreign_key_checks равным 0.Это позволяет избежать проблем с перезагрузкой таблиц в определенном порядке при перезагрузке дампа.Также можно установить эту переменную вручную:

mysql> SET foreign_key_checks = 0;
mysql> SOURCE dump_file_name;
mysql> SET foreign_key_checks = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...