繁体   English   中英

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

[英]Adding Foreign Key Fails in MySQL - errno 150 - using mysqldump

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

更新2:对于以下任何人,问题出在我的mysqldump命令包含--compact选项。 这删除了包括FOREIGN_KEY_CHECKS = 0在内的mysqldump功能; 在转储文件的顶部。 现在,删除压缩后,该问题已完全解决。 无需手动将其插入我的转储文件中。

进行mysqldump时可以指定表的顺序吗?

我正在将本地主机MySQL数据库上传到共享服务器。 我在尝试用外键重新创建表时遇到以下错误。 “#1005-无法创建表'username_test.gemdetail'(errno:150)”该sql语句如下。 删除Constraint子句后,表导入就可以了)

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

我检查了以下情况(如果我错过了一些情况,请纠正我):

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

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

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 2013年9月5日23:04:40)协议版本:10

您必须首先创建表gem,因为您在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演示

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

SET FOREIGN_KEY_CHECKS=0; 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM