【发布时间】:2019-04-11 01:21:22
【问题描述】:
我正在创建一个多项选择测验数据库,当我尝试创建 CorrectAnswer 表时,我收到以下错误:
消息 1785,第 16 级,状态 0,第 15 行 在表 'CorrectAnswer' 上引入 FOREIGN KEY 约束 'FK__CorrectAn__Answe__5BE2A6F2' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。 消息 1750,第 16 级,状态 1,第 15 行 无法创建约束或索引。查看以前的错误。
CREATE DATABASE PeriodicTableQuiz
CREATE TABLE Question(
QuestionID INT IDENTITY(1,1) PRIMARY KEY,
QuizQuestion VARCHAR(MAX) DEFAULT NULL
);
CREATE TABLE AnswerChoices(
AnswerID INT IDENTITY(1,1) PRIMARY KEY,
Answer VARCHAR(MAX) DEFAULT NULL,
QuestionID INT NOT NULL,
FOREIGN KEY(QuestionID) REFERENCES Question(QuestionID) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE CorrectAnswer(
CorrectAnswerID INT IDENTITY(1,1) PRIMARY KEY,
QuestionID INT NOT NULL,
FOREIGN KEY(QuestionID) REFERENCES Question(QuestionID) ON DELETE CASCADE ON UPDATE CASCADE,
AnswerID INT NOT NULL,
FOREIGN KEY(AnswerID) REFERENCES AnswerChoices(AnswerID) ON DELETE CASCADE ON UPDATE CASCADE
);
我想在 Question 表中插入问题,在 AnswersChoices 表中插入答案。 CorrectAnswer 应该有 QuestionID 和 AnswerID 分别引用 Question 和 AnswerChoices 表。
【问题讨论】:
-
为什么
CorrectAnswer bit不只是AnswerChoices中的一列?您可以轻松地将其限制为只有一个可能正确的答案,而无需引入所有这些(可能不必要的)级联复杂性 - 您不会找到很多粉丝。 -
如果会有多个答案,您可以在答案表中创建另一列 IsCorrect。并且您不能在 CorrectAnswer 表上允许级联,因此如果您删除一个答案,您需要删除该问题,并且与该问题相关的所有答案,它将成为循环依赖。
-
@AaronBertrand 那么您是否建议在 AnswerChoices 表中添加一个 CorrectAnswer 列?
-
您确实需要处理该架构。就像其他人指出的那样,
CorrectAnswer表是不必要的 -
除了在
AnswerChoices中有一个标志似乎是最好的选择,在CorrectAnswer中不需要QuestionID。加入AnswerChoices即可获得。
标签: sql sql-server