我使用mysqldumnp(来自MySQL 5.6.27)创建了一个SQL文件,并使用它来重新创建数据库(到MySQL 5.7.9):
CREATE TABLE `my_table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`user_id` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `my_table_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
我收到此错误:
[Err] 1215 - 无法添加外键约束
然后我运行了查询SHOW ENGINE INNODB STATUS
,得到了以下形式的'最新外键错误'标题:
2016-02-05 12:27:08 0x7f1b8f54b700外键约束错误 table my_db / my_table:FOREIGN KEY(
user_id
)REFERENCESusers
(user_id
))ENGINE = InnoDB DEFAULT CHARSET = utf8 ROW_FORMAT = COMPACT: 无法解析表名附近:(user_id
))ENGINE = InnoDB DEFAULT CHARSET = utf8 ROW_FORMAT = COMPACT
我在运行set FOREIGN_KEY_CHECKS = 0;
后尝试运行此SQL命令,但仍然遇到同样的错误。
这似乎表明问题在于我可以运行此查询之前需要users
表。但是,我有另一部分SQL转储(在此部分之前),它具有引用完全相同的表和列的外键约束 - users.user_id
- 并且运行时没有任何错误。
所以我, 1)混淆为什么会发生这种情况 2)很想知道是否有任何方法指示mysqldump格式化转储文件的方式,使得创建表的命令首先在转储文件中,然后添加外键的命令,从而绕过问题表格不存在。
注意:我还使用Navicat中的Data Tranfer工具来复制转储文件所包含的同一个数据库,并且运行正常。这似乎表明,无论Navicat如何使用常规法来处理约束,而尝试使用命令行导入转储文件则不然。
答案 0 :(得分:1)
打开.sql备份文件,并在my_table
之后移动users
的SQL脚本(创建和插入),然后再次运行恢复过程。
在创建引用的外键之前,user
表必须存在。
也许其他表会遇到同样的问题,请确保表依赖项没问题。
答案 1 :(得分:0)
我遇到了这个问题,发现可以在创建MySQL转储文件时使用--single-transaction
选项来避免此问题。
这是一个示例,假设您使用的是Linux系统:
$ mysqldump --databases YourDatabaseNamesHere \
--user=YourUserNameHere \
--password=YourPasswordHere \
--single-transaction > dump.sql
当心,使用--compact
选项可防止将忽略外键的转储文件注释写入文件。