Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中添加外键失败-errno 150-使用mysqldump_Mysql_Foreign Keys - Fatal编程技术网

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

在MySQL中添加外键失败-errno 150-使用mysqldump,mysql,foreign-keys,Mysql,Foreign Keys,更新:该死-难道你不知道我一发布就收到了aha!在创建过程中,主表需要排在第一位 更新2:对于下面的任何人,问题在于我的mysqldump命令包含--compact选项。这删除了mysqldump的功能,包括外部密钥检查=0;在转储文件的顶部。现在,随着compact的移除,问题完全解决了。无需手动将其插入我的转储文件 我可以在执行mysqldump时指定表的顺序吗 我正在将本地主机MySQL数据库上载到我的共享服务器。我在尝试使用外键重新创建表时遇到以下错误。“#1005-无法创建表'user

更新:该死-难道你不知道我一发布就收到了aha!在创建过程中,主表需要排在第一位

更新2:对于下面的任何人,问题在于我的mysqldump命令包含--compact选项。这删除了mysqldump的功能,包括外部密钥检查=0;在转储文件的顶部。现在,随着compact的移除,问题完全解决了。无需手动将其插入我的转储文件

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

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

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

我已经检查了以下情况(如果我遗漏了什么,请纠正我):

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

我还尝试导入一个新的空数据库。有什么想法吗?提前感谢你的帮助

mysqldump生成的sql代码的相关部分(为了可读性,我删除了其他列和键,但这段精简的代码会产生相同的结果):

最后,数据库版本信息:

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

您必须首先创建表gems,因为您在gemdail表中引用它,所以它必须存在:

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;

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

SET FOREIGN_KEY_CHECKS=0; 

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

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

SET FOREIGN_KEY_CHECKS=0; 

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

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

SET FOREIGN_KEY_CHECKS=0; 

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

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

SET FOREIGN_KEY_CHECKS=0; 

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

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

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

我得到了答案!在我发帖后第二次回复。谢谢你的快速回复。现在的问题是,我可以使用mysqldump正确地排列表的顺序吗?目前我使用的是:mysqldump-h localhost-u user-ppassword--compact--add drop table--quick dbname>dump.sqlsorry,我还没有听说过类似这样的东西。。。我搜索了一下,但是没有找到这个。。。禁用外键检查只会加快插入查询的速度,而不是忽略创建问题。它具有更快的插入速度和以任意顺序创建表的能力:。。。外键约束的目标丢失是默认的,而不匹配(例如,针对不同数据类型的列)仍将引发错误。是的,你是对的,我错了。我学到了更多:)谢谢你提供的信息。我得到了aha!在我发帖后第二次回复。谢谢你的快速回复。现在的问题是,我可以使用mysqldump正确地排列表的顺序吗?目前我使用的是:mysqldump-h localhost-u user-ppassword--compact--add drop table--quick dbname>dump.sqlsorry,我还没有听说过类似这样的东西。。。我搜索了一下,但是没有找到这个。。。禁用外键检查只会加快插入查询的速度,而不是忽略创建问题。它具有更快的插入速度和以任意顺序创建表的能力:。。。外键约束的目标丢失是默认的,而不匹配(例如,针对不同数据类型的列)仍将引发错误。是的,你是对的,我错了。我学到了更多:)谢谢你提供的信息。我得到了aha!在我发帖后第二次回复。谢谢你的快速回复。现在的问题是,我可以使用mysqldump正确地排列表的顺序吗?目前我使用的是:mysqldump-h localhost-u user-ppassword--compact--add drop table--quick dbname>dump.sqlsorry,我还没有听说过类似这样的东西。。。我搜索了一下,但是没有找到这个。。。禁用外键检查只会加快插入查询的速度,而不是忽略创建问题。它具有更快的插入速度和以任意顺序创建表的能力:。。。不允许外键约束的丢失目标