我有一个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检查吗?
答案 0 :(得分:78)
您还可以使用--init-command
命令的mysql
参数。
即:mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...
答案 1 :(得分:66)
您可以通过将字符串连接到内联文件来完成此操作。我确信有一种更简单的方法来连接字符串和文件,但它可以工作。
cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql
我认为您不需要将其设置为1,因为它只是一个会话。
答案 2 :(得分:14)
另外一个做同样的事情:
{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
答案 3 :(得分:6)
登录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;
答案 4 :(得分:0)
基于评论和答案,我最终将其用于InnoDB和MyISAM的压缩数据库导入:
{ echo "SET FOREIGN_KEY_CHECKS=0;SET UNIQUE_CHECKS=0;" ; zcat dump.gz ; } | mysql
答案 5 :(得分:0)
.gz文件的另一种方法:
gunzip < backup.sql.gz | mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" -u <username> -p