2

使用默认引擎 (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) )。

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

4

4 回答 4

6

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

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

于 2012-04-11T15:23:35.660 回答
1

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

于 2013-10-01T17:41:50.470 回答
0

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

您可以尝试以下查询以查看阻止创建约束的值 -

SELECT *
FROM codes
LEFT JOIN ask_codes
    ON codes.associated_code_id = ask_codes.code_id
WHERE ask_codes.code_id IS NULL
于 2012-04-11T14:58:37.963 回答
-6

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

于 2012-04-11T14:54:01.913 回答