L'introduzione del vincolo FOREIGN KEY 'c_name' nella tabella 't_name' può causare cicli o più percorsi a cascata

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

Domanda

Ho una tabella di database chiamata Lezione :
colonne: [LessonID, LessonNumber, Description] ... più alcune altre colonne

Ho un'altra tabella chiamata Lesson_ScoreBasedSelection :
colonne: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3[

Quando una lezione è completata, il suo LessonID viene cercato nella tabella Lesson_ScoreBasedSelection per ottenere le tre possibili lezioni successive, ognuna delle quali è associata a un determinato intervallo di punteggi. Se il punteggio fosse 0-33, verrebbe utilizzato l'ID Lesson memorizzato in NextLessonID_1. Se il punteggio fosse 34-66, verrebbe utilizzato l'ID lezione memorizzato in NextLessonID_2 e così via.

Voglio vincolare tutte le colonne nella tabella Lesson_ScoreBasedSelection con chiavi esterne che fanno riferimento alla colonna LessonID nella tabella delle lezioni, poiché ogni valore nella tabella Lesson_ScoreBasedSelection deve avere un voce nella colonna LessonID della tabella Lesson. Voglio anche gli aggiornamenti in cascata attivati, in modo che se un LessonID cambi nella tabella Lesson, tutti i riferimenti ad esso nella tabella Lesson_ScoreBasedSelection vengano aggiornati.

Questo particolare aggiornamento in cascata sembra un aggiornamento unidirezionale molto semplice, ma quando provo ad applicare un vincolo di chiave esterna a ciascun campo nella tabella Lesson_ScoreBasedSelection che fa riferimento al campo LessonID nella tabella Lesson , Ottengo l'errore:

L'introduzione del vincolo FOREIGN KEY 'c_name' nella tabella ' Lesson_ScoreBasedSelection ' può causare cicli o più percorsi a cascata.

Qualcuno può spiegare perché sto ricevendo questo errore o come posso ottenere i vincoli e l'aggiornamento a cascata che ho descritto?

È stato utile?

Soluzione

Dato il vincolo di SQL Server su questo, perché non risolvere questo problema creando una tabella con SelectionID (PK), LessonID, Next_LessonID, QualifyingScore come colonne. Utilizzare un vincolo per assicurarsi che LessonID e QualifyingScore siano univoci.

Nella colonna QualifyingScore, userei un tinyint e lo renderei 0, 1 o 2. Quello, oppure potresti fare una colonna QualifyingMinScore e QualifyingMaxScore in modo da poter dire,

SELECT * FROM NextLesson 
WHERE LessonID = @MyLesson 
AND QualifyingMinScore <= @MyScore 
AND @MyScore <= QualifyingMaxScore

Saluti,
Eric

Altri suggerimenti

Non è possibile avere più di un collegamento RI in cascata a una singola tabella in una determinata tabella collegata. Microsoft spiega questo:

  

Questo messaggio di errore viene visualizzato perché   in SQL Server non è possibile visualizzare una tabella   più di una volta in un elenco di tutti   le azioni referenziali a cascata che   vengono avviati da DELETE o da   Istruzione UPDATE. Ad esempio, il   albero delle azioni referenziali a cascata   deve avere solo un percorso per a   tabella particolare sulla cascata   albero delle azioni referenziali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top