58

我有一个 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] 

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

4

6 回答 6

147

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

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

MySQL 5.5 文档 - mysql 选项

于 2016-01-14T23:05:33.307 回答
83

You can do this by concatenating the string to the file inline. I'm sure there's an easier way to concatenate strings and files, but it works.

cat <(echo "SET FOREIGN_KEY_CHECKS=0;") imports.sql | mysql

I don't think you need to set it back to 1 since it's just one session.

于 2013-04-11T00:32:40.067 回答
20

登录mysql命令行:

mysql -u <username> -p -h <host_name or ip>然后运行

1SET FOREIGN_KEY_CHECKS=0;

2.use database <database_name>

3SOURCE /pathToFile/backup.sql;

4SET FOREIGN_KEY_CHECKS=1;

于 2018-04-18T14:48:48.607 回答
15

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

{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
于 2014-01-31T21:25:55.967 回答
4

.gz 文件的另一种方式:

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

于 2020-12-06T02:39:58.593 回答
0

根据评论和答案,我最终将其用于 InnoDB 和 MyISAM 的压缩数据库导入:

{ echo "SET FOREIGN_KEY_CHECKS=0;SET UNIQUE_CHECKS=0;" ; zcat dump.gz ; } | mysql
于 2020-01-28T22:32:35.537 回答