Отключение проверки внешнего ключа в командной строке
У меня есть резервная копия script для моей базы данных MySQL, используя mysqldump
с опцией --tab
, поэтому она создает файл .sql
для структуры и файл .txt
(разделенный на трубы) для содержимого.
В некоторых таблицах есть внешние ключи, поэтому при импорте я получаю сообщение об ошибке:
ОШИБКА 1217 (23000) в строке 8: Не удается удалить или обновить родительскую строку: ограничение внешнего ключа завершено
Я знаю об использовании SET FOREIGN_KEY_CHECKS=0
(и SET FOREIGN_KEY_CHECKS=1
после этого). Если я добавлю их в каждый .sql
файл, то импорт будет работать. Но тогда, очевидно, на следующем mysqldump
они будут перезаписаны.
Я также попытался запустить его как отдельную команду, как показано ниже, но ошибка возвращается:
echo "SET FOREIGN_KEY_CHECKS=0" | mysql [user/pass/database]
[all the imports]
echo "SET FOREIGN_KEY_CHECKS=1" | mysql [user/pass/database]
Есть ли другой способ отключить проверки FK в командной строке?
Ответы
Ответ 1
Вы можете сделать это, объединив строку в файл inline. Я уверен, что есть более простой способ конкатенации строк и файлов, но он работает.
cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql
Я не думаю, что вам нужно установить его обратно в 1, поскольку это всего лишь один сеанс.
Ответ 2
Вы также можете использовать параметр --init-command
команды mysql
.
I.e.: mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...
Документация MySQL 5.5 - параметры mysql
Ответ 3
Еще один, чтобы сделать то же самое:
{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
Ответ 4
Войдите в командную строку mysql:
mysql -u <username> -p -h <host_name or ip>
Затем запустите
1 SET FOREIGN_KEY_CHECKS=0;
2 SOURCE/pathToFile/backup.sql;
3 SET FOREIGN_KEY_CHECKS=1;