当我在我的数据库上运行mysqldump命令然后尝试导入它时,它会失败,因为它尝试按字母顺序创建表,即使它们可能有一个外键在文件后面引用一个表。 documentation中似乎没有任何内容,我发现this之类的答案表示在创建文件后更新文件包括:
set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;
是否无法自动设置这些行或以必要的顺序导出表(无需手动指定所有表名,因为这可能很乏味且容易出错)?我可以将这些行包装在脚本中,但是想知道是否有一种简单的方法可以确保我可以转储文件然后导入它而无需手动更新它。
答案 0 :(得分:44)
默认情况下,自版本4.1.1以来MySQL包含的mysqldump
命令会生成一个关闭外键检查的脚本。以下行包含在转储文件顶部附近:
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40014 ... */
语法是conditional comment,将在MySQL 4.0.14及更高版本上执行。旧的外键检查设置将在转储文件的末尾恢复:
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
请注意,条件注释是interpreted by the the client(而不是服务器)。如果使用不支持它们的客户端加载转储文件,则不会禁用外键检查,并且可能会遇到错误。为了获得最佳结果,我建议使用官方mysql命令行客户端加载转储文件:
mysql -hserver -uuser -p database < dumpfile.sql
还值得注意的是,如果使用--compact
选项运行mysqldump
,则转储文件中将省略禁用和重新启用外键检查的命令。
答案 1 :(得分:31)
当心。 出于某种原因,如果使用--compact选项,mysqldump不会写FOREIGN_KEY_CHECKS = 0.
侨
答案 2 :(得分:11)
如果您在导出SQL时使用phpMyAdmin,请选择自定义导出方法。然后在复选框选项中,单击“禁用外键检查”。导出的SQL语句将分别在输出文件的开头和结尾处具有禁用和启用外键检查。
它不是“自动的”,但您不必为每次导出自己编写语句。
答案 3 :(得分:8)
如果您使用--compact
作为mysqldump
命令之一,则可能会发生这种情况。
--compact
包含--skip-comments
,因此--compact
应使用--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
答案 4 :(得分:2)
当心使用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")')
我认为mycli不了解conditional comments。