【问题标题】:MySQL 5.5 errno: 150 "Foreign key constraint is incorrectly formed"MySQL 5.5 errno:150“外键约束格式不正确”
【发布时间】: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。

【问题讨论】:

  • 我不确定您的屏幕截图是否反映了现实,并且两列的类型不完全相同。

标签: mysql sql mariadb mysql-5.5


【解决方案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 个字节。

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 2018-06-19
      • 2018-03-02
      • 2020-07-07
      • 1970-01-01
      • 2017-04-13
      • 2019-09-17
      • 2020-12-16
      相关资源
      最近更新 更多