FOREIGN KEY Einschränkung ‚c_name‘ Einführung auf dem Tisch ‚t_name‘ können Zyklen oder mehrere kaskadenWege verursachen
-
03-07-2019 - |
Frage
Ich habe eine Datenbanktabelle namens Lesson
:
Spalten: [LessonID, LessonNumber, Description]
... plus einige andere Spalten
Ich habe eine andere Tabelle namens Lesson_ScoreBasedSelection
:
Spalten: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]
Wenn eine Lektion abgeschlossen ist, seine LessonID in der Lesson_ScoreBasedSelection
Tabelle nachgeschlagen, um die drei möglichen nächsten Lektionen zu erhalten, von denen jede mit einem bestimmten Bereich von Noten zugeordnet sind. Wenn die Gäste 0-33 sind, die LessonID in NextLessonID_1 gespeichert würde verwendet werden. Wenn die Partitur 34-66 ist gespeicherte LessonID in NextLessonID_2 verwendet werden würde, und so weiter.
Ich möchte mit der LessonID Spalte in der Stundentafel Referenzierung Fremdschlüssel alle Spalten in der Tabelle Lesson_ScoreBasedSelection
beschränken, da jeder Wert in der Lesson_ScoreBasedSelection
Tabelle muss einen Eintrag in der Spalte LessonID der Stundentafel. Ich möchte auch Kaskade Updates eingeschaltet, so dass, wenn ein LessonID Veränderungen in der Stundentafel, alle Verweise auf sie in der Lesson_ScoreBasedSelection
Tabelle aktualisiert.
Dieses besondere Kaskade-Update scheint wie ein sehr einfaches, one-way-Update, aber wenn ich versuche, einen Fremdschlüssel zu jedem Feld in der Lesson_ScoreBasedSelection
Tabelle anzuwenden Referenzierung das LessonID Feldes in der Stundentafel, erhalte ich die Fehlermeldung:
FOREIGN KEY Einschränkung 'c_name' auf dem Tisch 'Lesson_ScoreBasedSelection
' Einführung kann Zyklen oder mehrere kaskadenWege verursachen.
Kann mir jemand erklären, warum ich diesen Fehler bin immer oder wie ich die Zwänge erreichen können und Cascading Aktualisierung I beschrieben?
Lösung
, um die SQL Server-Einschränkung auf diesem gegeben, warum Sie dieses Problem nicht lösen, indem eine Tabelle mit SelectionID Erstellung (PK), LessonID, Next_LessonID, QualifyingScore wie die Spalten. Verwenden Sie eine Einschränkung, um sicherzustellen, LessonID und QualifyingScore einzigartig sind.
In der QualifyingScore Spalte, ich Tinyint verwenden würde, und machen es 0, 1 oder 2. Das, oder Sie können eine QualifyingMinScore und QualifyingMaxScore Spalte tun so, man könnte sagen,
SELECT * FROM NextLesson
WHERE LessonID = @MyLesson
AND QualifyingMinScore <= @MyScore
AND @MyScore <= QualifyingMaxScore
Cheers,
Eric
Andere Tipps
Sie können nicht mehr als eine Kaskadierung RI-Link zu einer einzigen Tabelle haben in einer bestimmten verknüpften Tabelle. Microsoft erklärt dies:
Sie erhalten diese Fehlermeldung, da in SQL Server kann eine Tabelle nicht angezeigt mehr als einmal in einer Liste aller die kaskadierende referenzielle Aktionen, die entweder durch eine DELETE oder gestartet UPDATE-Anweisung. Zum Beispiel kann die Baum von kaskadierenden referenziellen Aktionen muss nur einen Weg zu einem haben insbesondere Tabelle auf der Kaskadierung referenziellen Aktionen Baum.