MySQL创建questionsinexam表遇ERROR 1215:无法添加外键约束
解析ERROR 1215: Cannot add foreign key constraint的原因
这个外键创建失败的问题,主要是因为你对复合主键的外键关联逻辑理解有误,加上引用了非主键字段导致的,具体拆解来看:
1. 错误拆分了复合主键的外键关联
exam表的主键是复合主键:(subjectID, courseID, examNumber)。这意味着exam表中是通过这三个字段的组合来唯一标识一条记录的,单独的subjectID、courseID或者examNumber都不是唯一的。
你现在把这三个字段拆成了三个独立的外键分别关联,这不符合外键的要求——外键必须引用被关联表的主键或者唯一约束字段。单独的subjectID在exam表中可能对应多条记录,MySQL不允许这种非唯一字段作为外键的目标。
正确的做法是创建一个复合外键,一次性关联exam表的三个主键字段:
CONSTRAINT `fk_exam` FOREIGN KEY (`idExamSubject`, `idExamCourse`, `idExamNumber`) REFERENCES `test`.`exam` (`subjectID`, `courseID`, `examNumber`) ON DELETE NO ACTION ON UPDATE NO ACTION
2. 引用了question表的非主键字段
同样的问题,question表的主键是复合主键:(subjetID, questionNumber)(这里注意字段拼写是subjetID,少了个字母c,建议后续修正为subjectID,避免和其他表的字段名不一致引发问题)。
你当前只关联了questionNumber字段,但这个字段本身不是question表的唯一标识,单独拿出来无法唯一确定一条question记录,所以MySQL拒绝创建这个外键。
解决办法是:先在questionsinexam表中添加对应question.subjetID的字段,然后创建复合外键关联这两个主键字段:
-- 先在表结构中添加对应字段 `idQuestionSubject` VARCHAR(2) NOT NULL, -- 再创建复合外键 CONSTRAINT `fk_question` FOREIGN KEY (`idQuestionSubject`, `idQuestionNumber`) REFERENCES `test`.`question` (`subjetID`, `questionNumber`) ON DELETE NO ACTION ON UPDATE NO ACTION
修正后的完整CREATE TABLE语句
这里给你调整后的完整建表语句,已经修复了上述问题:
CREATE TABLE `test`.`questionsinexam` ( `idExamSubject` VARCHAR(2) NOT NULL, `idExamCourse` VARCHAR(2) NOT NULL, `idExamNumber` VARCHAR(2) NOT NULL, `idQuestionSubject` VARCHAR(2) NOT NULL, `idQuestionNumber` VARCHAR(3) NOT NULL, `pointsPerQuestion` INT NULL, PRIMARY KEY (`idExamSubject`, `idExamCourse`, `idExamNumber`, `idQuestionSubject`, `idQuestionNumber`), INDEX `fk_exam_idx` (`idExamSubject`, `idExamCourse`, `idExamNumber` ASC), INDEX `fk_question_idx` (`idQuestionSubject`, `idQuestionNumber` ASC), CONSTRAINT `fk_exam` FOREIGN KEY (`idExamSubject`, `idExamCourse`, `idExamNumber`) REFERENCES `test`.`exam` (`subjectID`, `courseID`, `examNumber`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_question` FOREIGN KEY (`idQuestionSubject`, `idQuestionNumber`) REFERENCES `test`.`question` (`subjetID`, `questionNumber`) ON DELETE NO ACTION ON UPDATE NO ACTION );
内容的提问来源于stack exchange,提问作者Asaf
相关产品推荐
相关产品推荐

