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

StackOverflow https://stackoverflow.com/questions/803836

質問

Lesson というデータベーステーブルがあります:
列: [LessonID、LessonNumber、説明] ...その他の列

Lesson_ScoreBasedSelection という別のテーブルがあります:
列: [LessonID、NextLessonID_1、NextLessonID_2、NextLessonID_3]

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

Lesson_ScoreBasedSelection テーブル内のすべての値には、 Lesson_ScoreBasedSelection テーブルのすべての値がレッスンテーブルのLessonID列のエントリ。また、カスケード更新を有効にして、LessonテーブルでLessonIDが変更された場合、 Lesson_ScoreBasedSelection テーブル内のそれへのすべての参照が更新されるようにします。

この特定のカスケード更新は非常に簡単な一方向の更新のように見えますが、レッスンテーブルのLessonIDフィールドを参照する Lesson_ScoreBasedSelection テーブルの各フィールドに外部キー制約を適用しようとすると、エラーが表示されます:

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

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

役に立ちましたか?

解決

これに関する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

乾杯、
エリック

他のヒント

リンクテーブル内の1つのテーブルにカスケードRIリンクを複数設定することはできません。 Microsoft がこれについて説明しています:

  

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top