更新:该死的 - 难道你不知道,我发布的那一分钟我得到了哈哈!主表需要先创建。在MySQL中添加外键失败 - errno 150 - 使用mysqldump
更新2:对于任何人后,问题是与我的mysqldump命令包含--compact选项。这删除了包括FOREIGN_KEY_CHECKS = 0的mysqldump功能;在转储文件的顶部。现在,紧凑的删除,问题完全解决。无需手动将其插入到我的转储文件中。
我可以在执行mysqldump时指定表的顺序吗?
我正在上传localhost MySQL数据库到我的共享服务器。尝试重新创建带有外键的表时出现以下错误。 “#1005 - 无法创建表'username_test.gemdetail'(errno:150)”sql语句如下。当删除约束条款时,这些表导入就好了)
从MySQL - FOREIGN KEY约束文档: 如果您重新创建了已删除的表,它必须具有符合外键约束的定义引用它。如前所述,它必须具有正确的列名和类型,并且必须在引用的键上有索引。如果这些不满足,MySQL将返回错误号1005并引用错误消息中的错误150。
我已经检查了如下条件(纠正我,请我是否错过了什么):
1)这两个表必须是ENGINE = InnoDB的。 - 是 2)两个表必须具有相同的字符集。 - 是 3)父表中的PK列和FK列必须是相同的数据类型。 - 是 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套接字的本地主机 软件:MySQL 软件版本:5.5。32-log - MySQL社区服务器(GPL)(BetterLinux 01 Sep 5 2013 23:04:40) 协议版本:10
是的,有时我们并不总是知道真正的问题是什么。至于不清楚,@Filipe Silva能够给出答案而不会产生一个全新的问题。与其他帖子一样,任何在这个问题上搜索的人经常会遇到这些问题。 – mseifert