在命令行上禁用外键检查

Dis*_*oat 46 mysql command-line foreign-keys mysqlimport

我有一个MySQL数据库的备份脚本,使用mysqldump--tab选项,因此它.sql为结构生成一个文件,并.txt为内容生成一个文件(管道分隔).

有些表有外键,所以当我导入它时,我收到错误:

第8行的错误1217(23000):无法删除或更新父行:外键约束失败

我知道使用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] 
Run Code Online (Sandbox Code Playgroud)

是否有其他方法可以在命令行上禁用FK检查?

Wik*_*tor 92

您也可以使用命令--init-command参数mysql.

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

MySQL 5.5文档 - mysql选项

  • 这是最好的解决方案,比"爆炸药丸"的答案更好 (7认同)

Exp*_*lls 69

您可以通过将字符串连接到内联文件来完成此操作.我确信有一种更简单的方法来连接字符串和文件,但它确实有效.

cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql
Run Code Online (Sandbox Code Playgroud)

我不认为你需要将它设置回1,因为它只是一个会话.

  • @Barmar记得外键是InnoDB引擎的产物,而不是MySQL本身 (3认同)
  • @ExplosionPills @Barmar刚遇到另一个问题,如何禁用实际数据导入的FK检查?我的表有自己的FK,可以引用以后的ID.我的导入命令是`mysqlimport [user/pass] --local --fields-terminated-by ="|" 数据库"table.txt"` (2认同)

小智 15

只是另一个做同样的事情:

{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
Run Code Online (Sandbox Code Playgroud)


dee*_*pak 11

登录到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;


小智 10

.gz 文件的另一种方法:

gunzip < backup.sql.gz | mysql --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" -u <username> -p