Можете ли вы автоматически создать файл mysqldump, который не применяет ограничения внешнего ключа?
Когда я запускаю команду mysqldump в своей базе данных, а затем пытаюсь ее импортировать, происходит сбой при попытке создать таблицы в алфавитном порядке, даже если у них может быть внешний ключ, который ссылается на таблицу позже в файле. Похоже, в документации ничего нет, и я нашел ответы вроде этого, в которых сказано обновить файл после его создания, чтобы он включал:
set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;
Нет ли способа автоматически установить эти строки или экспортировать таблицы в нужном порядке (без необходимости вручную указывать все имена таблиц, поскольку это может быть утомительным и подверженным ошибкам)? Я мог бы обернуть эти строки в сценарии, но мне было интересно, есть ли простой способ убедиться, что я могу вывести файл и затем импортировать его, не обновляя его вручную.
Ответы
Ответ 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 не понимает условных комментариев.