MySQL错误:1005无法创建表'myTable'(错误号:150)

时间:2012-02-29 16:59:11

标签: mysql foreign-keys mysql-error-1005

我已经阅读了很多关于此错误的帖子,但没有一个解决方案能够解决问题(假设我已经正确地尝试了它们)。

这是导致错误的代码:

CREATE TABLE season
(
  id          smallint unsigned NOT NULL auto_increment,
  title       varchar(25) NOT NULL,

  PRIMARY KEY (id)
);

CREATE INDEX seasonId ON season(id);

DROP TABLE IF EXISTS event;
CREATE TABLE event
(
  id           smallint unsigned NOT NULL auto_increment,
  title        varchar(255) NOT NULL,
  season_id    smallint NOT NULL,

  PRIMARY KEY (id),
  FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
);

因此,根据错误,我的外键声明存在问题。但是我已经在机器上运行了这个代码而没有任何问题,并且它在我的Linux机器上运行也很完美(我目前正在Windows 7下工作)。

以下是SHOW ENGINE INNODB STATUS的输出:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
120229 17:43:28 Error in foreign key constraint of table fcrcontent/event:
FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

我也尝试在新数据库上运行我的脚本,但没有去。

以下是show create table season的输出:

| season | CREATE TABLE `season` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(25) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `seasonId` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

4 个答案:

答案 0 :(得分:4)

由于season.id是无符号的,因此event.season_id也需要是无符号的:

CREATE TABLE event
(
  id           smallint unsigned NOT NULL auto_increment,
  title        varchar(255) NOT NULL,
  season_id    smallint unsigned NOT NULL,

  PRIMARY KEY (id),
  FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
);

答案 1 :(得分:2)

对于“无法创建表'X'(错误号:150)”的问题,请查看this page

他指出的最重要的事情是,在命令行发生后立即登录你的mysql服务器并输入:

  

SHOW ENGINE INNODB状态;

那将会发出各种各样的废话,但最重要的是你应该看到一个标题为“最新的外键错误”的部分,在那里你会看到实际的问题,说出这样的话:

  
     

最新的外键错误

     

121114 16:22:57表dgweb / company的外键约束出错:   引用表中没有包含索引的索引   列作为第一列,或者是数据类型   引用表与表中的表不匹配。约束:   ,     CONSTRAINT“fk_company_wf_reporting_info”FOREIGN KEY(“wf_reporting_info”)参考> “wf_reporting_info”(“wf_reporting_info_id”)   表中外键中的索引是“fk_company_wf_reporting_info”   见http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html   正确的外键定义。

然后你会知道到底出了什么问题: - )。

答案 2 :(得分:1)

由于您没有显示show create table season的输出,我无法确定您的问题是什么。

但是,MySQL docs有一个清单:

  
      
  • 相应的列[...]必须具有类似的内部数据类型。 [..] 整数类型的大小和符号必须相同

  •   
  • InnoDB需要外键和引用键的索引[...]。

  •   
  • [...]在引用的表中,必须有一个索引,其中引用的列被列为相同顺序的第一列。

  •   

(强调我的)。

请确保您的餐桌符合这些标准;如果仍然失败,请阅读文档页面上的其余条件。

答案 3 :(得分:0)

这:

`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

需要与此完全相同的类型:

season_id    smallint NOT NULL,

所以将其改为

smallint(5)