MySQL - 无法添加外键约束(1215)

时间:2016-02-05 12:42:18

标签: mysql mysqldump

我使用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)REFERENCES users   (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如何使用常规法来处理约束,而尝试使用命令行导入转储文件则不然。

2 个答案:

答案 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选项可防止将忽略外键的转储文件注释写入文件。