L'introduction de la contrainte FOREIGN KEY 'c_name' sur la table 't_name' peut provoquer des cycles ou plusieurs chemins en cascade

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

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top