2013-10-15 45 views
0

更新:该死的 - 难道你不知道,我发布的那一分钟我得到了哈哈!主表需要先创建。在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

+0

是的,有时我们并不总是知道真正的问题是什么。至于不清楚,@Filipe Silva能够给出答案而不会产生一个全新的问题。与其他帖子一样,任何在这个问题上搜索的人经常会遇到这些问题。 – mseifert

回答

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; 
+0

是的,这是最终的解决方案和解决问题的方法。谢谢。 – mseifert

+0

我的意思是给它一个大拇指(他在你身后数秒)。我纠正了它。再次感谢。 – mseifert

+0

没问题。真高兴你做到了。 –

1

您应该在“gemdetail”之前创建“宝石”,切换创建查询。

+0

我得到了哈哈!在我发布后回答第二个问题。感谢您迅速回复。现在的问题是我可以使用mysqldump来正确放置表的顺序?目前我使用:mysqldump -h localhost -u用户-ppassword --compact --add-drop-table --quick dbname> dump.sql – mseifert

+0

对不起,我还没有听到某些东西,如东西...我搜索了一个但没有什么... 禁用foreign_key_checks只会让你的插入查询更快,它不是为了忽略创建问题 – tanaydin

+1

它更快的插入*和*以任意顺序创建表的能力:http:// dev。 mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html ...缺失外键约束的目标是默默允许的,而不匹配(例如针对不同数据类型的列)仍然会抛出错误。 –

相关问题