当我在数据库上运行mysqldump命令,然后try 导入它时,它会失败,因为它试图按字母顺序创建表,即使它们可能有一个外键,该外键引用了文件后面的表.documentation中似乎没有任何内容,我找到了this这样的答案,即在文件创建后更新文件,包括:

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

是否无法自动设置这些行或按必要的顺序导出表(无需手动指定所有表名,因为这可能会很繁琐且容易出错)?我可以将这些行打包成一个脚本,但我想知道是否有一种简单的方法可以确保我可以转储一个文件,然后导入它,而无需手动更新它.

推荐答案

默认情况下,MySQL自版本4.1.1以来包含的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

还值得注意的是,如果mysqldump使用--compact选项运行,则转储文件中会忽略禁用和重新启用外键判断的命令.

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

如果WHERE语句包含所有列,唯一键顺序是否重要?

找出同一表中列A中的每个值在列B中出现的次数

使用MySQL工作台导出具有数据的数据库表并导入到其字段具有不同数据类型的同一表中

根据SQL中的平均范围对学生进行排名

为什么MySQL派生条件下推优化不起作用

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

Eloquent:通过国外模型得到平均分

在 MySQL 中,如何对 LIKE 查询进行批量更新,删除字符?

如何在 WampServer 上重新初始化 MySQL 以允许 lower_case_table_names = 2

Mysql,显示谁已经和没有 Select 退出巴士服务

从三个不同的表中生成两列,并使用分组变量计算这些列的比率

MySQL 根据另一列中的值更改空值

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

你如何 OR 两个 LIKE 语句?

如何在 MySQL 中为用户设置默认架构

从另一个表中 Select 具有 id 的行

如何将本地托管的 MySQL 数据库与 docker 容器连接

获得上个月的第一天和最后一天的最佳方式?

带有 WHERE 子句的 MySql 内连接