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

标签 mysql

我已经使用 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 - Cannot add foreign key constraint

然后我运行查询SHOW ENGINE INNODB STATUS并得到以下形式的“最新外键错误”标题:

2016-02-05 12:27:08 0x7f1b8f54b700 Error in foreign key constraint of table my_db/my_table: FOREIGN KEY (user_id) REFERENCES users (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT: Cannot resolve table name close to: (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

我还尝试在运行 set FOREIGN_KEY_CHECKS = 0; 后运行此 SQL 命令,但仍然遇到相同的错误。

这似乎表明问题在于需要先就位 users 表,然后才能运行此查询。但是,我有 SQL 转储的另一部分(在这部分之前),它具有引用完全相同的表和列的外键约束 - users.user_id - 并且运行时没有任何错误。 p>

所以我是, 1)对于为什么会发生这种情况感到困惑并且 2)想知道是否有任何方法可以指示 mysqldump 格式化转储文件,以便创建表的命令首先出现在转储文件中,然后添加外键的命令,从而避免该问题包含不存在的表。

注意:我还使用 Navicat 中的数据传输工具在转储文件包含的同一数据库中进行复制,并且运行正常。这似乎表明 Navicat 正在使用管理来处理约束,而尝试使用命令行导入转储文件则不然。

最佳答案

打开 .sql 备份文件并将 my_table 的 SQL 脚本(创建和插入)移至 users 之后,然后再次运行恢复过程。

在创建引用的外键之前,user 表必须存在。

也许其他表也会出现同样的问题,请确保表依赖关系正常。

关于MySQL - 无法添加外键约束(1215),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35224559/

相关文章:

mysql - 在 MySQL 中获取行直到满足特定条件

javascript - 是否可以使用 Angular 与 PHP 进行通信?

MySQL:如果有任何行匹配,则选择组

java - 当 id 为 null 时自动增加但当 id 不为 null 时应用分配的值以进行 hibernate ?

mysql group by,右连接。订单不起作用

php - 如何显示从嵌套查询派生的数据透视表?

具有多列的mysql多个COUNT

Mysql:使用 "OR"匹配哪些字段

php - 基于MySQl将PHP字符串插入另一个字符串

php - 连接多个表,特定列返回 0? PHP/MySQL