使用默认引擎(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):无法创建表'my_table。#sql-3311_16115'(错误号:150 ))。
这是语法问题吗?谢谢你的帮助,
答案 0 :(得分:6)
问题是两列的类型不同 - 它们不完全匹配:
如果重新创建已删除的表,则必须具有定义 符合引用它的外键约束。它必须 拥有正确的列名和类型,并且必须具有索引 如前所述,引用的密钥。如果不满意,MySQL 返回错误号1005并在错误中引用错误150 消息。
答案 1 :(得分:1)
我添加@ phpGeek的好答案,你也需要在数值中使用相同的LENGTH,这意味着如果表A有“id INT(11)”,表B也必须有“A_id INT(11)”。 / p>
答案 2 :(得分:0)
当你运行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
答案 3 :(得分:-5)
我认为这只是InnoDB的一个限制。它不支持外键。至少这就是我上次打击我时离开这个问题的方式。