在命令行上禁用外键检查

时间:2013-04-11 00:20:50

标签: mysql command-line foreign-keys mysqlimport

我有一个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检查吗?

6 个答案:

答案 0 :(得分:78)

您还可以使用--init-command命令的mysql参数。

即:mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" ...

MySQL 5.5 Documentation - mysql options

答案 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