Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Вернитесь к чертежной доске.

Ответ 2

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

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

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

Ответ 3

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

set foreign_key_checks=0;

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

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

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

mysql> SET foreign_key_checks = 0;
mysql> SOURCE dump_file_name;
mysql> SET foreign_key_checks = 1;