我已经使用 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
) REFERENCESusers
(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/