我使用mysqldumnp创建了一个SQL文件(来自MySQL 5.6.27),并正在使用它重新创建数据库(到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表my_db/my_ table : FOREIGN KEY (
user_id) REFERENCESusers(user_id) ENGINE=InnoDB默认CHARSET=utf8 ROW_FORMAT=COMPACT:无法解析表名接近:(user_id) ENGINE=InnoDB默认CHARSET=utf8 ROW_FORMAT=COMPACT
在运行set FOREIGN_KEY_CHECKS = 0;之后,我还尝试运行这个SQL命令,但仍然得到了相同的错误。
这似乎表明,在我能够运行此查询之前,users表所需的问题是正确的。但是,我有SQL的另一部分(在此部分之前),它具有引用完全相同的表和列( users.user_id )的外键约束,并且运行时没有任何错误。
因此,我感到困惑,1)为什么会发生这种情况,2)我很想知道是否有任何方法指示mysqldump格式化转储文件,使创建表的命令首先出现在转储文件中,然后是添加外键的命令,从而避免了不存在的表的问题。
注意:我还使用Navicat中的数据传输工具在转储文件包含并运行ok的同一个数据库之间进行复制。这似乎表明,不管是什么常规的Navicat,都是使用mananges来处理约束,而使用命令行导入转储文件的尝试则不是这样。
发布于 2016-06-22 16:19:29
打开.sql备份文件,在my_table的users之后移动SQL脚本(创建和插入),然后再次运行还原过程。
在创建引用的外键之前,user表必须存在。
也许其他表也会遇到同样的问题,请确保表依赖关系正常。
发布于 2020-12-02 16:28:03
我遇到了这个问题,发现在创建--single-transaction转储文件时可以使用MySQL选项来避免这个问题。
下面是一个例子,假设您在Linux系统上:
$ mysqldump --databases YourDatabaseNamesHere \
--user=YourUserNameHere \
--password=YourPasswordHere \
--single-transaction > dump.sql注意,使用--compact选项可以防止忽略外键的dumpfile注释写入文件。
https://stackoverflow.com/questions/35224559
复制相似问题