L'introduzione del vincolo FOREIGN KEY 'c_name' nella tabella 't_name' può causare cicli o più percorsi a cascata
-
03-07-2019 - |
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?
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.