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

Posted

技术标签:

【中文标题】MySQL 5.5 errno:150“外键约束格式不正确”【英文标题】:MySQL 5.5 errno: 150 "Foreign key constraint is incorrectly formed" 【发布时间】:2019-07-10 14:12:50 【问题描述】:

关于这个错误有很多问题,但我似乎找不到任何与我所拥有的相似的场景。

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

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

我正在尝试更改第一个表并添加一个引用第二个表的 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。

【问题讨论】:

我不确定您的屏幕截图是否反映了现实,并且两列的类型不完全相同。 【参考方案1】:

如果主键和外键的类型不完全匹配,我们会看到这个错误。虽然两者看起来都是宽度为 1 的整数,但我的猜测是密钥关系中的 INT 列之一是无符号的,而另一个是有符号的。一种可能的解决方法是使两列都无符号:

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

编辑:

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

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

【讨论】:

目前学院的id和用户的collegelinkId都已签名 那么为什么您会收到此错误没有任何意义。它们是数字列,因此整理是可能的解释。唯一可以解释的是,您使用不同的引擎创建了 userscollege 表。 是的,正如我提到的,唯一不同的是auto_increment。 “使用不同的引擎创建”是什么意思? 例如您使用 MyISAM 创建了一个表,而另一个使用 InnoDB 创建了表。我建议您仔细检查列定义/类型。 列定义/类型相同。但是,我确实检查了确实不同的引擎类型。谢谢你的建议!【参考方案2】:

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

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

ALTER TABLE users
ENGINE=InnoDB;

【讨论】:

【参考方案3】: 验证数据类型是否匹配(PRIMARY KEY 除外)。 验证两个表都是ENGINE=InnoDB

即使在此之后,仍然会出现错误 150。 3 种解决方法:

在创建表时禁用 FK,然后重新启用。 CREATE TABLEs 没有 FK,然后是 ALTER ... ADD ... FKs 确保以正确的顺序执行CREATEs

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

【讨论】:

以上是关于MySQL 5.5 errno:150“外键约束格式不正确”的主要内容,如果未能解决你的问题,请参考以下文章

mysql。无法创建表 errno 150

MySQL创建表:错误1005 errno:150“外键约束形成错误”

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

MySQL:创建带有 FK 错误的表 (errno 150)

如何解决mysql代码的errno 150? [复制]

errno: 150 "外键约束格式不正确 - mysql