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

时间:2009-04-29 19:15:49

标签: sql-server foreign-keys cascade

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

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

课程结束后,会在Lesson_ScoreBasedSelection表中查找其LessonID,以获得三个可能的下一课,每个课程都与特定的分数范围相关联。如果得分为0-33,则将使用存储在NextLessonID_1中的LessonID。如果分数为34-66,则将使用存储在NextLessonID_2中的LessonID,依此类推。

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

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

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

任何人都可以解释为什么我会收到此错误或如何实现我所描述的约束和级联更新?

2 个答案:

答案 0 :(得分:4)

在任何给定的链接表中,您不能有多个级联RI链接到单个表。 Microsoft解释了这一点:

  

您收到此错误消息是因为   在SQL Server中,无法显示表   在所有列表中不止一次   这种级联参照行为   由DELETE或者启动   更新声明。例如,   层叠参照行动的树   必须只有一条路径   关于级联的特殊表   参考行动树。

答案 1 :(得分:2)

鉴于SQL Server对此的约束,为什么不通过创建一个以SelectionID(PK),LessonID,Next_LessonID,QualifyingScore作为列的表来解决此问题。使用约束来确保LessonID和QualifyingScore是唯一的。

在QualifyingScore列中,我使用tinyint,并将其设为0,1或2.那么,或者您可以执行QualifyingMinScore和QualifyingMaxScore列,这样您就可以说了,

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

干杯,
埃里克