Mysql 在命令行上禁用外键检查
我有一个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
--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代码>
2SOURCE/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)使用这是我的首选方法,用于不按特定顺序上载父表和子表。向上投票!;)这不是从命令行禁用的选项,而是针对客户端的。