Mysql,innodb - 无法创建外键

Posted

技术标签:

【中文标题】Mysql,innodb - 无法创建外键【英文标题】:Mysql, innodb - Can't create foreign key 【发布时间】:2012-04-23 21:43:00 【问题描述】:

使用默认引擎 (MyIsam),我可以使用以下语法创建外键:

alter table `codes` add constraint foreign key(`associated_code_id`) references ask_codes(code_id)  on update cascade on delete cascade;

但是,当我使用 INNODB 创建表时,我不再能够创建外键(mysql 给我 ERROR 1005 (HY000): Can't create table 'my_table.#sql-3311_16115' (errno: 150 ))。

这是语法问题吗?感谢您的帮助,

【问题讨论】:

根据文档:无法创建表。如果错误消息涉及错误 150,则表创建失败,因为未正确形成外键约束。 【参考方案1】:

我相信这只是 InnoDB 的一个限制。它不支持外键。至少上次我遇到这个问题时,我就是这样摆脱了这个问题。

【讨论】:

其他方式。 MyISAM 不支持 FK 约束。 不。 InnoDB 支持 FK - dev.mysql.com/doc/refman/5.5/en/…【参考方案2】:

我在@phpGeek 的最佳答案中补充说,您还需要在数值中具有相同的 LENGTH,这意味着如果表 A 具有“id INT(11)”表 B 也必须具有“A_id INT(11)”。

【讨论】:

【参考方案3】:

您的问题是两列的类型不同 - 它们不完全匹配:

如果你重新创建一个被删除的表,它必须有一个定义 符合引用它的外键约束。它必须 具有正确的列名和类型,并且它必须在 引用的键,如前所述。如果这些都不满足,MySQL 返回错误号 1005 并在错误中引用错误 150 消息。

【讨论】:

好的,谢谢。需要 index(col_name) 约束和完全匹配的类型...【参考方案4】:

如果我没记错的话,当您为 MyISAM 表运行 ALTER 语句时,它会默默地忽略 FK 约束。当您为 InnoDB 运行它时,它会尝试通过将约束应用于表来验证约束。我认为当 FK 约束对现有行失败时会发生此错误 - InnoDB Error Codes

您可以尝试以下查询来查看哪些值阻止了约束创建 -

SELECT *
FROM codes
LEFT JOIN ask_codes
    ON codes.associated_code_id = ask_codes.code_id
WHERE ask_codes.code_id IS NULL

【讨论】:

感谢您的帮助 - 两个表都是空的,所以这个查询有效时什么也不返回! @rix - 在这种情况下,可能是因为 ask_codes 是 MyISAM 表或数据类型不匹配。它需要是 InnoDB 并且两个字段必须是相同的数据类型。

以上是关于Mysql,innodb - 无法创建外键的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 无法使用外键创建新表

DBeaver中的mysql表无法设置外键

MySQL - 无法添加或更新子行:外键约束失败

MySQL 错误 1215:无法添加外键约束

innodb和myisam的区别

MySQL (InnoDB)在什么情况下无法使用索引