MySQL 5.5 错误号:150 "Foreign key constraint is incorrectly formed"

MySQL 5.5 errno: 150 "Foreign key constraint is incorrectly formed"

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

我的第一个 table(用户):

我的第 2 个 table(大学):

我正在尝试更改第一个 table 并添加一个引用第二个 tableid 的外键:

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

失败并出现错误 (errno: 150 "Foreign key constraint is incorrectly formed")

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

如果主键和外键的类型不完全匹配,我们预计会看到此错误。虽然两者看起来都是宽度为 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,您仍然会遇到此错误。要解决此问题,请将表格中的引擎更改为相同类型。

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

由于列的类型相同,因此有必要按照@Tim Biegeleisen 的建议检查引擎类型。

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

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

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

  • 创建表时禁用 FK,然后 re-enable。
  • CREATE TABLEs 没有 FK,然后 ALTER ... ADD ... FKs
  • 确保 CREATEs 的顺序正确。

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