0

Lesson私は:
列: ...と呼ばれるデータベーステーブルを持っています[LessonID, LessonNumber, Description]...さらにいくつかの他の列

と呼ばれる別のテーブルがありますLesson_ScoreBasedSelection
列: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]

レッスンが完了すると、そのレッスン ID がLesson_ScoreBasedSelectionテーブルで検索され、次の 3 つの可能なレッスンが取得されます。各レッスンは、特定の範囲のスコアに関連付けられています。スコアが 0 ~ 33 の場合、NextLessonID_1 に格納されている LessonID が使用されます。スコアが 34 ~ 66 の場合は、NextLessonID_2 に格納されている LessonID が使用されます。

テーブル内のすべての値が Lesson テーブルの LessonID 列にエントリを持っている必要があるLesson_ScoreBasedSelectionため、lesson テーブルの LessonID 列を参照する外部キーを使用して、テーブル内のすべての列を制約したいと考えています。Lesson_ScoreBasedSelectionまた、カスケード更新をオンにして、Lesson テーブルで LessonID が変更された場合に、テーブル内のすべての参照Lesson_ScoreBasedSelectionが更新されるようにします。

この特定のカスケード更新は非常に単純な一方向の更新のようにLesson_ScoreBasedSelection見えますが、Lesson テーブルの LessonID フィールドを参照するテーブルの各フィールドに外部キー制約を適用しようとすると、次のエラーが発生します。

テーブル ' ' に FOREIGN KEY 制約 'c_name' を導入Lesson_ScoreBasedSelectionすると、サイクルまたは複数のカスケード パスが発生する可能性があります。

このエラーが発生する理由、または説明した制約とカスケード更新を実現する方法を誰かが説明できますか?

4

2 に答える 2

4

特定のリンク テーブル内の 1 つのテーブルに対して、複数のカスケード RI リンクを持つことはできません。 マイクロソフトはこれについて次のように説明しています。

このエラー メッセージが表示されるのは、SQL Server では、DELETE ステートメントまたは UPDATE ステートメントのいずれかによって開始されるすべてのカスケード参照アクションのリストにテーブルを複数回表示できないためです。たとえば、カスケード参照アクションのツリーは、カスケード参照アクション ツリー上の特定のテーブルへのパスを 1 つだけ持つ必要があります。

于 2009-04-29T19:22:03.330 に答える
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

乾杯、
エリック

于 2009-04-29T20:07:09.620 に答える