2009-04-29 43 views
0

我有一個數據庫表叫Lesson引進國外KEY約束「c_name」:
列:[LessonID, LessonNumber, Description] ...加上一些列表「t_name」可能會導致循環或多個級聯路徑

我有另一臺名爲Lesson_ScoreBasedSelection
列:[LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]

當完成一個教訓,它LessonID在Lesson_ScoreBasedSelection表得到擡頭三個可能的下一課,每個課都與特定範圍的分數相關聯。如果得分爲0-33,則將使用存儲在NextLessonID_1中的LessonID。如果得分爲34-66,則將使用存儲在NextLessonID_2中的LessonID,依此類推。

我想用外鍵引用Lesson_ScoreBasedSelection表中的所有列,因爲外鍵引用課程表中的LessonID列,因爲Lesson_ScoreBasedSelection表中的每個值都必須在Lesson表的LessonID列中有一個條目。我還希望打開級聯更新,以便在Lesson表中更改LessonID時,Lesson_ScoreBasedSelection表中的所有引用都會更新。

這個特殊的級聯更新看起來像是一個非常簡單的單向更新,但是當我嘗試將外鍵約束應用於引用Lesson表中的LessonID字段的Lesson_ScoreBasedSelection表中的每個字段時,出現錯誤:

引入表'Lesson_ScoreBasedSelection'上的FOREIGN KEY約束'c_name'可能會導致循環或多個級聯路徑。

任何人都可以解釋爲什麼我得到這個錯誤,或者我怎麼能實現我描述的約束和級聯更新?

回答

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 

乾杯,
埃裏克

+0

這是一個好主意。我也可以將字段合併到Lesson表中,因爲它本質上是一對一的關係,但我不想混亂Lesson表並使其更新查詢複雜化。它的設置原因很簡單,因爲它很容易在SQL Server Management Studio中查看和填充數據,因爲它類似於數據源自的電子表格。無論如何,你的解決方案可能是最好的解決方案,它可以使得每個課程明確指定分數和靈活。我想我沒有辦法解決SQL Server的侷限性。 – Triynko 2009-04-29 23:08:12

4

在任何給定鏈接表中,您不能有多個級聯RI鏈接到單個表。 Microsoft解釋這一點:

You receive this error message because in SQL Server, a table cannot appear more than one time in a list of all the cascading referential actions that are started by either a DELETE or an UPDATE statement. For example, the tree of cascading referential actions must only have one path to a particular table on the cascading referential actions tree.

+0

我明白了什麼錯誤是,我只是不明白爲什麼他們實施週期檢測,從而簡單地認爲它錯誤地指出我的鏈接「可能會導致循環或多個級聯路徑」,當可以證明它通過定向依賴關係圖,它不會導致任何這樣的週期。微軟使用的實現似乎沒有考慮關係的方向或依賴關係,所以它不能檢測真實的週期,而是檢測它們的可能性。也許它是以這種方式實現的,因爲觸發器運行的可能性或其他... – Triynko 2012-03-04 20:07:45

相關問題