MySQL添加外键触发ERROR 1005 (HY000):无法创建表'student.#sql-f40_3'(错误码150)的问题求助
解决MySQL外键创建错误(ERROR 1005: errno 150)
你遇到的这个错误是MySQL外键约束创建失败的典型问题,咱们一步一步拆解原因和解决办法:
核心错误原因
你的ALTER语句犯了两个关键错误:
- 字段类型完全不匹配
你试图把personal表的city字段(varchar(20)类型)关联到applications表的app_id字段(int(5)类型)——这两个字段的类型、长度完全不同,MySQL外键要求关联的两个字段必须类型完全一致(包括字符集、是否无符号等细节)。 - 逻辑关联错误
从业务逻辑看,personal.city是城市名称,applications.app_id是申请记录的ID,这两个字段没有任何业务关联,强行关联完全不合理。
正确的解决方案
假设你的需求是:确保personal表中记录的城市,必须是applications表中存在的城市(也就是让personal.city参照applications.city的有效值),那可以按以下步骤操作:
步骤1:统一关联字段的类型长度
personal.city是varchar(20),而applications.city是varchar(10),先调整两者长度一致:
ALTER TABLE applications MODIFY COLUMN city varchar(20) NOT NULL DEFAULT 'Delhi';
步骤2:给父表关联字段添加索引
MySQL要求外键关联的父表字段必须有索引(主键、唯一键或普通索引都可以),给applications.city添加索引:
CREATE INDEX idx_applications_city ON applications(city);
步骤3:创建正确的外键约束
现在可以创建符合逻辑和规则的外键了:
ALTER TABLE personal ADD FOREIGN KEY (city) REFERENCES applications(city);
额外提示:其他可能引发errno150的场景
如果以后再遇到类似错误,还可以检查这些点:
- 父表和子表的存储引擎是否一致(必须都是InnoDB,MyISAM不支持外键)
- 子表中已存在的数据,是否在父表关联字段中没有对应匹配的值(比如
personal里有个城市在applications中找不到,会导致外键创建失败) - 外键约束的名称是否和已存在的约束重名
内容的提问来源于stack exchange,提问作者Anubhav
相关产品推荐
相关产品推荐

