Apresentando EXTERNA CHAVE restrição 'c_name' na tabela 't_name' pode causar ciclos ou vários caminhos em cascata

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

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top