您可以自动创建一个不强制外国密钥约束的mysqldump文件吗?
-
19-09-2019 - |
题
当我在数据库上运行mysqldump命令,然后尝试导入它时,它会尝试以字母顺序创建表,即使它们可能有一个外键可以在文件中引用表格。似乎没有什么 文档 而且我找到了类似的答案 这个 也就是说,在创建文件以包含以下内容之后更新:
set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;
是否没有办法自动设置这些行或按必要顺序导出表(而无需手动指定所有表名,因为这可能很乏味并且容易容易出错)?我可以将这些行包裹在脚本中,但是想知道是否有一种简单的方法来确保我可以将文件转储然后导入它而无需手动更新。
解决方案
这 mysqldump
MySQL随附的命令自版本以来 4.1.1 默认情况下,会产生一个脚本,该脚本关闭外国密钥检查。以下行包括在转储文件顶部附近:
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
这 /*!40014 ... */
语法为a 有条件的评论 这将在MySQL版本4.0.14及以后执行。旧的外键检查设置将在转储文件的末尾恢复:
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
请注意,条件评论是 由客户解释 (而不是服务器)。如果将转储文件加载到不支持它们的客户端,则外键检查将不会被禁用,您可能会遇到错误。为了获得最佳结果,我建议使用官方MySQL命令行客户端加载转储文件:
mysql -hserver -uuser -p database < dumpfile.sql
还值得注意的是,如果 mysqldump
与 --compact
选项,然后从转储文件中省略了禁用和重新启用外键检查的命令。
其他提示
谨防。由于某种原因,MySqlDump如果使用了 - compact选项,则mysqldump不会编写forefer_key_checks = 0。
再见。
如果您在导出SQL时使用phpmyadmin,请选择 自定义导出方法. 。然后在复选框选项中,单击“”禁用外国钥匙检查“。导出的SQL语句将分别在输出文件的开头和结尾进行禁用和启用外键检查。
这不是“自动”,但您不必为每个出口书写自己的陈述。
如果您使用的话,这可能会发生 --compact
作为你的一个 mysqldump
命令。--compact
包括 --skip-comments
所以与其 --compact
一个人应该使用 --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
当心您使用的MySQL客户端, mysql
命令,没问题。倾销:
% mysqldump -u ocp6 -pocp6 ocp6 --single-transaction --result-file=dump.sql
还原:
% mysql -u ocp6 -pocp6 ocp6 < dump.sql
一切安好。
使用 另一个mysql客户端 (mycli 在我的情况下)要恢复垃圾箱:
mysql ocp6@:(none)> \. dump.sql
[…]
(1005, 'Can\'t create table `ocp6`.`composition` (errno: 150 "Foreign key constraint is incorrectly formed")')