53

当我在我的数据库上运行 mysqldump 命令然后尝试导入它时,它会失败,因为它尝试按字母顺序创建表,即使它们可能有一个外键引用文件中稍后的表。文档中似乎没有任何内容,我发现这样的答案要在创建文件后更新文件以包含:

set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;

是否无法自动设置这些行或以必要的顺序导出表(无需手动指定所有表名,因为这可能很乏味且容易出错)?我可以将这些行包装在脚本中,但想知道是否有一种简单的方法可以确保我可以转储文件,然后在不手动更新的情况下导入它。

4

6 回答 6

63

自4.1.1mysqldump版以来 MySQL 包含的命令默认生成一个关闭外键检查的脚本。转储文件顶部附近包含以下行:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40014 ... */语法是一个条件注释,将在 MySQL 4.0.14 及更高版本上执行。旧的外键检查设置在转储文件末尾恢复:

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

请注意,条件注释由客户端(而不是服务器)解释。如果您使用不支持它们的客户端加载转储文件,则不会禁用外键检查,并且您可能会遇到错误。为了获得最佳效果,我建议使用官方 mysql 命令行客户端加载转储文件:

mysql -hserver -uuser -p database < dumpfile.sql

还值得注意的是,如果mysqldump使用该--compact选项运行,则转储文件中将省略禁用和重新启用外键检查的命令。

于 2010-03-12T00:34:47.637 回答
39

谨防。出于某种原因,如果使用了 --compact 选项,mysqldump 不会写入 FOREIGN_KEY_CHECKS=0。

再见。

于 2013-03-25T20:59:28.117 回答
12

如果您在导出 SQL 时使用 phpMyAdmin,请选择Custom Export Method。然后在复选框选项中,单击“禁用外键检查”。导出的 SQL 语句将分别在输出文件的开头和结尾处禁用和启用外键检查。

它不是“自动的”,但您不必为每次导出自己编写语句。

于 2013-10-04T11:16:03.727 回答
9

如果您将--compact其用作命令之一,则可能会发生这种情况mysqldump--compact包括--skip-comments所以--compact应该使用--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

于 2015-05-05T17:23:33.163 回答
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不理解条件注释

于 2018-07-16T23:16:48.353 回答
0

使用--single-transaction意味着在一笔交易中完成所有工作。那个选项不能忽略畸形Foreign key constraint。在任何事务中,任何错误都将停止继续执行查询。您的问题是您有一个Foreign key constraint不存在的表。

于 2022-01-26T17:46:27.660 回答