MySQL 5.5 errno:150“外键约束格式不正确”

时间:2019-07-10 14:12:50

标签: mysql sql mariadb mysql-5.5

关于此错误,有很多问题,但我似乎找不到与我类似的情况。

我的第一张桌子(用户):

enter image description here

我的第二张桌子(大学):

enter image description here

我正在尝试更改第一个表并添加引用第二个表的id的外键

ALTER TABLE users
ADD CONSTRAINT FOREIGN KEY (collegelinkId)
REFERENCES databaseName.colleges (id);

哪个失败,错误为(errno: 150 "Foreign key constraint is incorrectly formed")

这两个表之间唯一不同的参数是auto_increment。但是,我无法将auto_increment添加到我的用户表collegelinkId列中,因为其id已设置为auto_increment。

3 个答案:

答案 0 :(得分:1)

如果主键和外键的类型不完全匹配,我们希望看到此错误。尽管两者看起来都是宽度为1的整数,但我猜这里是键关系中的INT列之一是无符号的,而另一列是有符号的。可能的解决方法是使两列都没有符号:

ALTER TABLE users MODIFY collegelinkId INT(10) UNSIGNED NOT NULL;
ALTER TABLE college MODIFY id INT(10) UNSIGNED NOT NULL;

编辑:

您在我的回答下的最新评论证实了我的错。另一种可能性是您使用不同的数据库引擎创建了两个表。例如,如果您使用InnoDB创建了users,但是使用MyISAM创建了college,则仍然会出现此错误。要解决此问题,请将表上的引擎更改为相同的类型。

请注意,另一种可能性是两列具有不同的排序规则。但是,这实际上是有争议的,因为两列都是数字,而不是文本。

答案 1 :(得分:0)

由于各列的类型相同,因此值得按照@Tim Biegeleisen的建议检查引擎类型。

更改引擎类型解决了该问题。

ALTER TABLE users
ENGINE=InnoDB;

答案 2 :(得分:0)

  • 验证数据类型是否匹配(PRIMARY KEY除外)。
  • 验证两个表都是ENGINE=InnoDB

即使在此之后,错误150仍然可能发生。 3种解决方法:

  • 在创建表时禁用FK,然后重新启用。
  • CREATE TABLEs(不带FK),然后ALTER ... ADD ... FKs
  • 确保按正确的顺序执行CREATEs

一个旁注:在INT(2)中,(2)是无关紧要的。所有INTs均为4个字节。