MySQL创建外键报1824/1822错误:无法引用已存在的联合主键表
问题原因
- 核心问题是你为
degree表定义的是联合主键(title, idryma),MySQL的外键规则要求:外键必须完整匹配引用表的主键/唯一键,或者匹配联合索引的最左前缀。 - 你当前的写法是把联合主键的两个字段拆成两个独立外键分别引用:
- 单独引用
idryma的时候,degree表只有(title, idryma)的联合主键索引,idryma不在联合索引的最左位置,没有独立索引支撑,就会触发1822错误。 - 即便
title在联合索引最左前缀位置,可以用到索引,这种拆分关联的逻辑本身是错误的:你的degree表主键是两个字段组合才唯一,单独的title或idryma都可能重复,无法保证外键关联的唯一性。
- 单独引用
- 之前的
1824错误大概率是操作细节问题:比如执行SQL时未切换到对应数据库、表名大小写不匹配(Linux环境MySQL表名大小写敏感)、degree表未提前创建完成就执行关联语句。
解决方案
优先选择符合业务逻辑的联合外键方案,直接完整匹配degree表的联合主键即可:
- 建表时直接定义联合外键的写法:
create table degree( title varchar(50), idryma varchar(40), bathmida enum('High School', 'Univercity', 'Master', 'PHD'), constraint degree_id primary key (title, idryma) ); create table has_degree( degree_title varchar(50), degree_idryma varchar(40), employee_username varchar(12), acquisition_year year(4), grade float(3,1), -- 定义联合外键匹配degree的联合主键 constraint fk_has_degree_degree foreign key (degree_title, degree_idryma) references degree(title, idryma), foreign key (employee_username) references employee(employee_username), constraint has_degree_id primary key (degree_title, degree_idryma, employee_username) );
- 如果已经建完
has_degree表,用alter语句添加联合外键即可:
alter table has_degree add constraint fk_has_degree_degree foreign key (degree_title, degree_idryma) references degree(title, idryma);
不推荐方案:如果你确实需要单独关联两个字段(不符合你当前的表设计逻辑),可以给
degree表的title和idryma分别添加独立唯一索引,但这会违背你联合主键的设计初衷,强制要求两个字段单独都不能重复。
内容的提问来源于stack exchange,提问作者BrainlessPOMO
相关产品推荐
相关产品推荐

