在MySQL中添加外键失败 - 错误150 - 使用mysqldump

时间:2013-10-15 21:50:41

标签: mysql foreign-keys

更新:Darn - 你不知道我发布的那一刻我得到了啊哈!主表需要在创建中排在第一位。

更新2:对于任何关注者,问题在于我的mysqldump命令包含--compact选项。这删除了包含FOREIGN_KEY_CHECKS = 0的mysqldump功能;在转储文件的顶部。现在紧凑的移除,问题完全解决了。无需在我的转储文件中手动插入它。

我可以在执行mysqldump时指定表的顺序吗?

我将localhost MySQL数据库上传到我的共享服务器。尝试使用外键重新创建表时出现以下错误。 “#1005 - 无法创建表'username_test.gemdetail'(错误号:150)”sql语句如下。删除Constraint子句后,表导入就好了)

来自MySQL - FOREIGN KEY约束文档: 如果重新创建已删除的表,则它必须具有符合引用它的外键约束的定义。它必须具有正确的列名和类型,并且必须在引用的键上具有索引,如前所述。如果不满足,则MySQL返回错误号1005并在错误消息中引用错误150.

我检查了以下条件(如果我错过了某些内容,请纠正我):

1)这两个表必须是ENGINE = InnoDB。 - 是的 2)这两个表必须具有相同的字符集。 - 是的 3)父表和FK列中的PK列必须是相同的数据类型。 - 是的 4)父表和FK列中的PK列(如果它们具有定义排序规则类型)必须具有相同的排序规则类型; - 没有定义的 5)如果外键表中已有数据,则FK列值必须与父表PK列中的值匹配。 - 没有数据 6)子表不能是临时表。 - N / A

我也尝试过导入新的空数据库。有任何想法吗?在此先感谢您的帮助。

mysqldump生成的sql代码的相关部分(为了便于阅读,我删除了其他列和键,但这个剥离代码会产生相同的结果):

DROP TABLE IF EXISTS `gemdetail`;
CREATE TABLE `gemdetail` (
  `gemdetailid` int(10) NOT NULL AUTO_INCREMENT,
  `gemid` int(10) NOT NULL,
  PRIMARY KEY (`gemdetailid`),
  KEY `gemid` (`gemid`),
  CONSTRAINT `gemdetail_ibfk_1` FOREIGN KEY (`gemid`) REFERENCES `gems` (`gemid`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=875 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `gems`;
CREATE TABLE `gems` (
  `gemid` int(10) NOT NULL AUTO_INCREMENT,
  `userid` int(10) NOT NULL,
  PRIMARY KEY (`gemid`),
  KEY `userid` (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=528 DEFAULT CHARSET=utf8;

最后是数据库版本信息:

服务器:通过UNIX套接字的Localhost 软件:MySQL 软件版本:5.5.32-log - MySQL社区服务器(GPL)(BetterLinux 01 Sep 5 2013 23:04:40) 协议版本:10

2 个答案:

答案 0 :(得分:2)

你必须首先创建表格宝石,因为你在gemdetail表中引用它,所以它必须存在:

DROP TABLE IF EXISTS `gems`;
CREATE TABLE `gems` (
  `gemid` int(10) NOT NULL AUTO_INCREMENT,
  `userid` int(10) NOT NULL,
  PRIMARY KEY (`gemid`),
  KEY `userid` (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=528 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `gemdetail`;
CREATE TABLE `gemdetail` (
  `gemdetailid` int(10) NOT NULL AUTO_INCREMENT,
  `gemid` int(10) NOT NULL,
  PRIMARY KEY (`gemdetailid`),
  KEY `gemid` (`gemid`),
  CONSTRAINT `gemdetail_ibfk_1` FOREIGN KEY (`gemid`) REFERENCES `gems` (`gemid`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=875 DEFAULT CHARSET=utf8;

sqlfiddle demo

要在mysqldump之后创建表并且不为外键提供错误,请打开转储文件,将此语句放在开头:

SET FOREIGN_KEY_CHECKS=0; 

答案 1 :(得分:1)

你应该在“gemdetail”之前创建“gems”,切换创建查询。