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 并添加一个引用第二个 table 的 id
的外键:
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 个字节。
有很多关于此错误的问题,但我似乎找不到任何与我所遇到的类似的情况。
我的第一个 table(用户):
我的第 2 个 table(大学):
我正在尝试更改第一个 table 并添加一个引用第二个 table 的 id
的外键:
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 个字节。