0

更新:该死 - 你不知道我发布的那一刻我得到了啊哈!主表需要首先出现在创建中。

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

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

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

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

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

1)这两个表必须是ENGINE=InnoDB。- 是 2) 两个表必须具有相同的字符集。- 是 3) 父表中的 PK 列和 FK 列必须是相同的数据类型。- 是 4) 父表中的 PK 列和 FK 列,如果它们具有定义排序规则类型,则必须具有相同的排序规则类型;- 未定义 5) 如果外键表中已有数据,则 FK 列值必须与父表 PK 列中的值匹配。- NO DATA 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;

最后是数据库版本信息:

服务器:Localhost via UNIX socket 软件:MySQL 软件版本:5.5.32-log - MySQL Community Server (GPL) (BetterLinux 01 Sep 5 2013 23:04:40) 协议版本:10

4

2 回答 2

2

您必须先创建表 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;

sqlfiddle demo

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

SET FOREIGN_KEY_CHECKS=0; 
于 2013-10-15T21:55:33.903 回答
1

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

于 2013-10-15T21:55:54.397 回答