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

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

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

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

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

4b9b3361

Ответ 1

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

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

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

/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;

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

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

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

Ответ 2

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

Ciao.

Ответ 3

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

Это не "автоматическое", но вам не нужно писать заявления самостоятельно для каждого экспорта.

Ответ 4

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

Ответ 5

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

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

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

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

Все в порядке.

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

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

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