9

我已经阅读了许多其他关于在尝试添加外键 copnstraint 时接收 MySQL errno 150 的帖子,但是我还没有找到解决方案。我希望我没有做一些愚蠢的事情。我做了一个简单的测试用例。

  1. 这两个表都是 InnoDB。

  2. 这两个表都是 UTF-8。

  3. 两列都是 int(11) 无符号的(使 color_idNOT NULL没有区别)。编辑:我错了,这是解决方案

    这是我的两张表:

widgets

CREATE TABLE `widgets` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL DEFAULT '',
`color_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

colors

CREATE TABLE `colors` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我刚刚创建了这些表,没有内容。当我尝试添加外键约束以将 widgets.color_id 链接到 colors.id 时,会发生这种情况:

mysql> ALTER TABLE `widgets` ADD FOREIGN KEY (`color_id`) REFERENCES `color` (`id`);

ERROR 1005 (HY000): Can't create table 'production.#sql-7b1_2dd7' (errno: 150)

我要补充一点,我也无法使用我选择的 GUI 工具——OSX 上的 Sequel Pro——。尝试创建外键关系时收到相同的错误消息。

SHOW ENGINE INNODB STATUS返回这个:

130531 17:23:06 Error in foreign key constraint of table production/#sql-7b1_2c80: 
FOREIGN KEY (`color_id`) REFERENCES `colors` (`id`): 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.

我在做什么可笑的愚蠢?

4

2 回答 2

30

color_id不是unsigned并且有一个DEFAULT NULL. 列类型必须相同。

于 2013-05-31T21:34:33.400 回答
7

它几乎总是主键和外键之间类型不匹配的情况。

在大多数情况下提供一些帮助的提示:

  • 检查您尝试关联的表是否使用支持外键的引擎,例如 InnoDB
  • 检查列的类型是否相同并为空。例如(2 列必须匹配类型、类型大小和符号)
  • 检查目标列是否有索引或主键。
于 2013-05-31T21:37:17.527 回答