Можете ли вы автоматически создать файл mysqldump, который не применяет ограничения внешнего ключа? - PullRequest
41 голосов
/ 12 марта 2010

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

set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;

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

Ответы [ 5 ]

44 голосов
/ 12 марта 2010

Команда mysqldump, включенная в MySQL начиная с версии 4.1.1 , по умолчанию создает сценарий, который отключает проверку внешнего ключа. Следующая строка находится в верхней части файла дампа:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

Синтаксис /*!40014 ... */ - это условный комментарий , который будет выполняться в MySQL версии 4.0.14 и более поздних. Старый параметр проверки внешнего ключа восстанавливается в конце файла дампа:

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

Обратите внимание, что условные комментарии интерпретируются клиентом (а не сервером). Если вы загрузите файл дампа с клиентом, который их не поддерживает, проверка внешнего ключа не будет отключена, и вы можете столкнуться с ошибками. Для достижения наилучших результатов я бы рекомендовал загружать файлы дампа с помощью официального клиента командной строки mysql:

mysql -hserver -uuser -p database < dumpfile.sql

Стоит также отметить, что если mysqldump запускается с опцией --compact, то команды для отключения и повторного включения проверок внешнего ключа в файле дампа не указываются.

31 голосов
/ 26 марта 2013

Осторожно. По некоторым причинам mysqldump не записывает FOREIGN_KEY_CHECKS = 0, если используется опция --compact.

Ciao.

11 голосов
/ 04 октября 2013

Если вы используете phpMyAdmin при экспорте SQL, выберите Пользовательский метод экспорта .Затем среди опций флажка нажмите « Отключить проверки внешнего ключа ».В экспортированном операторе SQL будут отключены и включены проверки внешнего ключа в начале и конце выходного файла соответственно.

Это не «автоматически», но вам не придется самостоятельно писать операторы для каждого экспорта.

8 голосов
/ 05 мая 2015

Это может произойти, если вы используете --compact в качестве одной из команд mysqldump. --compact включает --skip-comments, поэтому вместо --compact следует использовать --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

2 голосов
/ 17 июля 2018

Остерегайтесь используемого вами MySQL-клиента с помощью команды mysql, никаких проблем. Демпинг:

% mysqldump -u ocp6 -pocp6 ocp6 --single-transaction --result-file=dump.sql 

Восстановление:

% mysql -u ocp6 -pocp6 ocp6 < dump.sql

Все хорошо.

С помощью другого клиента MySQL ( mycli в моей ситуации) для восстановления файла дампа:

mysql ocp6@:(none)> \. dump.sql
[…]
(1005, 'Can\'t create table `ocp6`.`composition` (errno: 150 "Foreign key constraint is incorrectly formed")')

Я предполагаю, что mycli не понимают условные комментарии .

...