创建表后如何添加外键?出现Error Code 1215报错如何解决
MySQL Error 1215 外键添加失败排查方案
你当前执行的外键添加语句为:
ALTER TABLE location_details ADD CONSTRAINT FK_location FOREIGN KEY (Zip) REFERENCES student_details(Zip);
出现该报错的常见原因和排查方式如下:
- 两个关联字段的类型、长度、是否允许为空属性完全不匹配。例如父表
student_details的Zip字段是INT(10)类型,子表location_details的Zip字段是VARCHAR(20)或者INT(5),只要属性存在差异就无法创建外键,必须保证两个关联字段属性完全一致。 - 父表关联字段未创建索引。外键要求被关联的父表字段至少为普通索引,主键、唯一索引也符合要求,可执行
SHOW INDEX FROM student_details;查看Zip字段是否在索引列表中。 - 两个表的存储引擎不支持外键或者不一致。只有InnoDB引擎支持外键约束,需要保证两个表的存储引擎均为InnoDB。
- 两个表的字符集、排序规则不一致。如果
Zip是字符串类型,两个表字符集不同(比如一个为utf8一个为gbk)、或者字符集相同但排序规则不同(比如一个为utf8_general_ci一个为utf8_bin)都会触发报错。 - 子表已存在不符合约束的数据。如果
location_details的Zip字段里存在student_details的Zip字段没有的数值,约束无法生效,需要先清理不符合要求的数据,或者把缺失的数值补充到父表中。 - 外键命名重复。你使用的
FK_location外键名称如果已被当前数据库的其他外键使用,也会触发报错,更换唯一的外键名称即可。
可按以下顺序执行命令快速排查:
- 执行
DESC location_details;和DESC student_details;对比两个Zip字段的属性是否完全一致- 执行
SHOW CREATE TABLE location_details;和SHOW CREATE TABLE student_details;核对两个表的存储引擎、字符集、排序规则是否相同- 执行
SELECT Zip FROM location_details WHERE Zip NOT IN (SELECT Zip FROM student_details);查询是否存在不匹配的数据
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

