0

我有一个名为Lesson
列: [LessonID, LessonNumber, Description] ...加上其他一些列的数据库表

我有另一个表名为Lesson_ScoreBasedSelection
列: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]

完成一堂课后,将在表中查找其 LessonIDLesson_ScoreBasedSelection以获得三个可能的下一课,每节课都与特定范围的分数相关联。如果分数是 0-33,将使用存储在 NextLessonID_1 中的 LessonID。如果分数是 34-66,将使用存储在 NextLessonID_2 中的 LessonID,依此类推。

我想Lesson_ScoreBasedSelection用引用课程表中的 LessonID 列的外键来约束表中的所有列,因为表中的每个值都Lesson_ScoreBasedSelection必须在课程表的 LessonID 列中有一个条目。我还希望打开级联更新,以便如果课程表中的课程 ID 发生更改,则表中对它的所有引用Lesson_ScoreBasedSelection都会更新。

这个特定的级联更新似乎是一个非常简单的单向更新,但是当我尝试将外键约束应用于Lesson_ScoreBasedSelection引用课程表中的 LessonID 字段的表中的每个字段时,我收到错误:

在表“”上引入 FOREIGN KEY 约束“c_name”Lesson_ScoreBasedSelection可能会导致循环或多个级联路径。

谁能解释我为什么会收到此错误或如何实现我描述的约束和级联更新?

4

2 回答 2

4

在任何给定的链接表中,您不能有多个级联 RI 链接到单个表。 微软对此进行了解释:

您会收到此错误消息,因为在 SQL Server 中,一个表不能多次出现在由 DELETE 或 UPDATE 语句启动的所有级联引用操作的列表中。例如,级联引用操作树必须只有一个路径到级联引用操作树上的特定表。

于 2009-04-29T19:22:03.330 回答
2

Given the SQL Server constraint on this, why don't you solve this problem by creating a table with SelectionID (PK), LessonID, Next_LessonID, QualifyingScore as the columns. Use a constraint to ensure LessonID and QualifyingScore are unique.

In the QualifyingScore column, I'd use a tinyint, and make it 0, 1, or 2. That, or you could do a QualifyingMinScore and QualifyingMaxScore column so you could say,

SELECT * FROM NextLesson 
WHERE LessonID = @MyLesson 
AND QualifyingMinScore <= @MyScore 
AND @MyScore <= QualifyingMaxScore

Cheers,
Eric

于 2009-04-29T20:07:09.620 回答