MySQL创建Grade表无法添加外键报错错误码3734问题求助
错误原因
该报错是外键引用规则不符合MySQL要求导致的:Enrolement表的主键为联合主键(stud_id, subj_code, semester, year),如果Grade表需要关联Enrolement表做外键约束,必须完整引用联合主键的所有字段,不能单独拆分semester、year这两个字段单独作为外键引用,且这两个字段在Enrolement表中没有独立的唯一索引,本身也不具备唯一标识性,不符合外键引用的基本要求。
另外你当前Grade表中给subj_code加了unique约束不符合业务逻辑:同一门课程在不同学期、不同年份会产生多条成绩记录,唯一约束会导致同课程只能存入一条成绩数据。
解决方案
将Grade表的外键调整为联合外键,直接关联Enrolement的完整联合主键即可,同时删除subj_code的多余唯一约束,调整后的建表语句如下:
CREATE TABLE Grade ( stud_id int unsigned not null, subj_code char(8) not null, semester smallint unsigned not null DEFAULT 1, year smallint unsigned not null, grade char(2) null, PRIMARY KEY(stud_id, subj_code, semester, year), FOREIGN KEY(stud_id, subj_code, semester, year) REFERENCES Enrolement(stud_id, subj_code, semester, year) );
如果需要保留单独关联Student和Subject的外键也可以,但没有必要,因为Enrolement表本身已经约束了stud_id和subj_code的合法性,关联Enrolement的联合主键已经能保证Grade表的四个主键字段都符合前置数据要求。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

