【问题标题】:Adding Foreign Key Fails in MySQL (errno 150)在 MySQL 中添加外键失败 (errno 150)
【发布时间】:2017-02-07 01:30:27
【问题描述】:

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

  1. 两个表都是 InnoDB。

  2. 两个表都是 UTF-8。

  3. 两列都是 int(11) 无符号的(使 color_id NOT 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.

我是不是在做一些非常愚蠢的事情??

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

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

    【讨论】:

    • 好的,这回答了这个问题——是的,我是个可笑的愚蠢。我发誓即使在发布问题时我也检查了unsigned,但我显然没有。多么尴尬。谢谢。
    • @Raolin 这发生在我们最好的人身上。至少你的问题写得很好。
    • 干杯伙伴,帮了我很多;)
    • 谢谢!我正要在 stackoverflow 上发帖,直到我发现我的第二列不是未签名的!
    • @NaturalBornCamper 很高兴听到你发现你的错误并做得很好。
    【解决方案2】:

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

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

    • 检查您尝试关联的表是否使用支持外键的引擎,例如 InnoDB
    • 检查列的类型是否相同且为空。例如(2 列必须匹配类型、类型大小和符号)
    • 检查目标列是否有索引或主键。

    【讨论】:

    • 几乎总是
    猜你喜欢
    • 2013-10-23
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2011-09-02
    • 2012-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多