Apresentando EXTERNA CHAVE restrição 'c_name' na tabela 't_name' pode causar ciclos ou vários caminhos em cascata
-
03-07-2019 - |
Pergunta
Eu tenho uma tabela de banco de dados chamado Lesson
:
colunas: [LessonID, LessonNumber, Description]
... além de algumas outras colunas
Eu tenho outra tabela chamada Lesson_ScoreBasedSelection
:
colunas: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]
Quando uma lição estiver concluída, a sua LessonID é procurado na tabela de Lesson_ScoreBasedSelection
para obter os três possíveis lições próximos, cada um dos quais estão associados com um determinado intervalo de pontuação. Se o resultado foi 0-33, seria usado o LessonID armazenados em NextLessonID_1. Se a pontuação foi 34-66, o LessonID armazenados em NextLessonID_2 seria usado, e assim por diante.
Eu quero restringir todas as colunas na tabela de Lesson_ScoreBasedSelection
com chaves estrangeiras que fazem referência a coluna LessonID na tabela de lição, uma vez que cada valor na tabela Lesson_ScoreBasedSelection
deve ter uma entrada na coluna LessonID da tabela de lição. Eu também quero atualizações em cascata ligado, de modo que se um LessonID alterações na tabela de lição, todas as referências a ele na tabela de Lesson_ScoreBasedSelection
ficar atualizado.
Esta atualização cascata em particular parece ser uma atualização muito simples, de sentido único, mas quando eu tentar aplicar uma restrição de chave estrangeira para cada campo na tabela de Lesson_ScoreBasedSelection
referenciando o campo LessonID na tabela de lição, eu recebo o erro:
Apresentando FOREIGN KEY restrição 'c_name' na tabela 'Lesson_ScoreBasedSelection
' pode causar ciclos ou caminhos múltiplos em cascata.
Alguém pode explicar por que estou recebendo este erro ou como eu posso conseguir os constrangimentos e cascata atualizando eu descrevi?
Solução
Dada a restrição de SQL Server sobre isso, por que não resolver este problema através da criação de uma tabela com SelectionID (PK), LessonID, Next_LessonID, QualifyingScore como as colunas. Use uma restrição para garantir LessonID e QualifyingScore são únicos.
Na coluna QualifyingScore, eu usaria um tinyint, e torná-lo 0, 1 ou 2. Que, ou você poderia fazer uma coluna QualifyingMinScore e QualifyingMaxScore então você poderia dizer,
SELECT * FROM NextLesson
WHERE LessonID = @MyLesson
AND QualifyingMinScore <= @MyScore
AND @MyScore <= QualifyingMaxScore
Cheers,
Eric
Outras dicas
Você não pode ter mais de uma cascata ligação RI para uma única tabela em qualquer tabela vinculada. Microsoft explica isso:
Você recebe essa mensagem de erro porque no SQL Server, uma tabela não pode aparecer mais de uma vez em uma lista de todos os em cascata ações referencial são iniciados por qualquer um DELETE ou um declaração UPDATE. Por exemplo, a árvore da cascata ações referenciais deve ter apenas um caminho para um especial tabela na cascata ações referenciais árvore.