Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在命令行上禁用外键检查_Mysql_Command Line_Foreign Keys_Mysqlimport - Fatal编程技术网

Mysql 在命令行上禁用外键检查

Mysql 在命令行上禁用外键检查,mysql,command-line,foreign-keys,mysqlimport,Mysql,Command Line,Foreign Keys,Mysqlimport,我有一个MySQL数据库的备份脚本,使用带有--tab选项的mysqldump,它为结构生成一个.sql文件,为内容生成一个.txt文件(管道分隔) 有些表有外键,因此在导入时会出现错误: 第8行出现错误1217(23000):无法删除或更新父行:外键约束失败 我知道如何使用设置外键检查=0(以及设置外键检查=1)。如果我将它们添加到每个.sql文件中,则导入工作正常。但是很明显,在下一个mysqldump上,这些文件会被覆盖 我还尝试将其作为单独的命令运行,如下所示,但错误再次出现: echo

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

有些表有外键,因此在导入时会出现错误:

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

我知道如何使用
设置外键检查=0
(以及
设置外键检查=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检查?

您可以通过将字符串连接到文件内联来实现这一点。我相信有一种更简单的方法来连接字符串和文件,但它是有效的

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

cat只需另一个即可执行相同操作:

{ echo "SET FOREIGN_KEY_CHECKS=0;" ; cat imports.sql ; } | mysql
您还可以使用
mysql
命令的
--init command
参数

即:
mysql--init命令=“设置会话外部密钥检查=0;”“..


登录到mysql命令行:

mysql-u-p-h
然后运行

1
设置外键检查=0

2
SOURCE/pathToFile/backup.sql


3
设置外键检查=1

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

{ echo "SET FOREIGN_KEY_CHECKS=0;SET UNIQUE_CHECKS=0;" ; zcat dump.gz ; } | mysql

使用.gz文件的另一种方法:


gunzip

这看起来是最好的方法。令人惊讶的是,
mysqldump
没有一个
--禁用外键
选项。@Barmar请记住,外键是InnoDB引擎的产品,而不是MySQL本身。谢谢,它正在工作!因此,设置FK检查只对一个命令有效,而不是在多个命令之间保持?@ExplosionPills@Barmar刚刚遇到另一个问题,如何在实际数据导入中禁用FK检查?我的表本身有一个FK,可能会引用以后的ID。我的导入命令是
mysqlimport[user/pass]--local--字段以=“|”database“table.txt”
有人知道如何在Windows中执行此操作吗?:/这是最好的解决方案,比我尝试过的“爆炸药丸”的答案更好,比如:mysql--init command=“SET SESSION FOREIGN\u KEY\u CHECKS=0;”-u root-p DBname,我发现您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第1mysql-init command=“SET SESSION FOREIGN\u KEY\u CHECKS=0;”-u root-p DBName”行附近使用的正确语法,该行位于1mysql--init command=“SET SESSION FOREIGN\u KEY\u CHECKS=0;”-u root-p DBNamezcat
ing我的另一个文件。我很困惑。您的说明是否暗示您应该直接从MySQL命令行运行此操作?您可能需要更新您的答案以澄清这一点。目前,它说不要直接从MySQL命令行运行。在步骤2之前,不要忘记使用以下命令选择数据库:2)使用这是我的首选方法,用于不按特定顺序上载父表和子表。向上投票!;)这不是从命令行禁用的选项,而是针对客户端的。