L'introduction de la contrainte FOREIGN KEY 'c_name' sur la table 't_name' peut provoquer des cycles ou plusieurs chemins en cascade
-
03-07-2019 - |
Question
J'ai une table de base de données appelée Lesson
:
colonnes: [Identifiant de la leçon, Numéro de la leçon, Description]
... ainsi que d'autres colonnes
J'ai une autre table appelée Lesson_ScoreBasedSelection
:
colonnes: [Identifiant de la leçon, NextLessonID_1, NextLessonID_2, NextLessonID_3]
Quand une leçon est terminée, son LessonID est recherché dans la table Lesson_ScoreBasedSelection
pour obtenir les trois prochaines leçons possibles, chacune étant associée à une plage de scores particulière. Si le score était compris entre 0 et 33, le LessonID stocké dans NextLessonID_1 serait utilisé. Si le score était compris entre 34 et 66, le LessonID stocké dans NextLessonID_2 serait utilisé, et ainsi de suite.
Je souhaite contraindre toutes les colonnes de la table Lesson_ScoreBasedSelection
avec des clés étrangères faisant référence à la colonne LessonID de la table de cours, car chaque valeur de la table Lesson_ScoreBasedSelection
doit avoir une entrée dans la colonne LessonID de la table Lesson. Je souhaite également que les mises à jour en cascade soient activées. Ainsi, si un élément LessonID est modifié dans la table Lesson, toutes ses références dans la table Lesson_ScoreBasedSelection
sont mises à jour.
Cette mise à jour en cascade particulière semble être une mise à jour très simple et à sens unique, mais lorsque j'essaie d'appliquer une contrainte de clé étrangère à chaque champ de la table Lesson_ScoreBasedSelection
faisant référence au champ LessonID de la table Lesson , Je reçois l’erreur:
L'introduction de la contrainte FOREIGN KEY 'c_name' sur la table ' Lesson_ScoreBasedSelection
' peut provoquer des cycles ou plusieurs chemins en cascade.
Quelqu'un peut-il expliquer pourquoi je reçois cette erreur ou comment je peux respecter les contraintes et la mise à jour en cascade que j'ai décrites?
La solution
Étant donné les contraintes de SQL Server, pourquoi ne pas résoudre ce problème en créant une table avec SelectionID (PK), LessonID, Next_LessonID, QualifyingScore comme colonnes. Utilisez une contrainte pour vous assurer que LessonID et QualifyingScore sont uniques.
Dans la colonne QualifyingScore, je voudrais utiliser un tinyint et lui attribuer la valeur 0, 1 ou 2. Cela, ou vous pouvez créer une colonne QualifyingMinScore et QualifyingMaxScore afin que vous puissiez dire:
SELECT * FROM NextLesson
WHERE LessonID = @MyLesson
AND QualifyingMinScore <= @MyScore
AND @MyScore <= QualifyingMaxScore
À la vôtre,
Eric
Autres conseils
Vous ne pouvez pas avoir plus d'un lien RI en cascade vers une seule table dans une table liée donnée. Microsoft explique ceci:
Vous recevez ce message d'erreur car dans SQL Server, une table ne peut pas apparaître plus d'une fois dans une liste de tous les actions référentielles en cascade qui sont lancés par un DELETE ou un Instruction UPDATE. Par exemple, le arbre d'actions référentielles en cascade ne doit avoir qu'un chemin d'accès à un table particulière sur la cascade arbre des actions référentielles.