首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -无法添加外键约束(1215)

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

Stack Overflow用户
提问于 2016-02-05 12:42:18
回答 2查看 1.4K关注 0票数 0

我使用mysqldumnp创建了一个SQL文件(来自MySQL 5.6.27),并正在使用它重新创建数据库(到MySQL 5.7.9):

代码语言:javascript
复制
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) REFERENCES users (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来处理约束,而使用命令行导入转储文件的尝试则不是这样。

EN

回答 2

Stack Overflow用户

发布于 2016-06-22 16:19:29

打开.sql备份文件,在my_tableusers之后移动SQL脚本(创建和插入),然后再次运行还原过程。

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

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

票数 1
EN

Stack Overflow用户

发布于 2020-12-02 16:28:03

我遇到了这个问题,发现在创建--single-transaction转储文件时可以使用MySQL选项来避免这个问题。

下面是一个例子,假设您在Linux系统上:

代码语言:javascript
复制
$ mysqldump --databases YourDatabaseNamesHere \
            --user=YourUserNameHere \
            --password=YourPasswordHere \
            --single-transaction > dump.sql

注意,使用--compact选项可以防止忽略外键的dumpfile注释写入文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35224559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档