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
都已签名
那么为什么您会收到此错误没有任何意义。它们是数字列,因此整理是可能的解释。唯一可以解释的是,您使用不同的引擎创建了 users
和 college
表。
是的,正如我提到的,唯一不同的是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创建表:错误1005 errno:150“外键约束形成错误”
MySQL + Rails:errno:150“外键约束格式不正确”