La introducción de la restricción FOREIGN KEY 'c_name' en la tabla 't_name' puede causar ciclos o múltiples rutas en cascada

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

Pregunta

Tengo una tabla de base de datos llamada Lesson :
columnas: [LessonID, LessonNumber, Descripción] ... más algunas otras columnas

Tengo otra tabla llamada Lesson_ScoreBasedSelection :
columnas: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3font>

Cuando se completa una lección, su LessonID se busca en la tabla Lesson_ScoreBasedSelection para obtener las tres próximas lecciones posibles, cada una de las cuales está asociada con un rango particular de puntajes. Si el puntaje fuera 0-33, se usaría el LessonID almacenado en NextLessonID_1. Si el puntaje fuera 34-66, se usaría el LessonID almacenado en NextLessonID_2, y así sucesivamente.

Quiero restringir todas las columnas en la tabla Lesson_ScoreBasedSelection con claves foráneas que hagan referencia a la columna LessonID en la tabla de la lección, ya que cada valor en la tabla Lesson_ScoreBasedSelection debe tener un entrada en la columna LessonID de la tabla Lesson. También quiero activar las actualizaciones en cascada, de modo que si un LessonID cambia en la tabla de Lección, todas las referencias a él en la tabla Lesson_ScoreBasedSelection se actualizan.

Esta actualización en cascada en particular parece una actualización unidireccional muy directa, pero cuando trato de aplicar una restricción de clave externa a cada campo en la tabla Lesson_ScoreBasedSelection que hace referencia al campo LessonID en la tabla Lesson , Me sale el error:

La introducción de la restricción FOREIGN KEY 'c_name' en la tabla ' Lesson_ScoreBasedSelection ' puede causar ciclos o múltiples rutas en cascada.

¿Alguien puede explicar por qué recibo este error o cómo puedo lograr las restricciones y la actualización en cascada que describí?

¿Fue útil?

Solución

Dada la restricción de SQL Server sobre esto, ¿por qué no resuelve este problema creando una tabla con SelectionID (PK), LessonID, Next_LessonID, QualifyingScore como las columnas. Use una restricción para asegurarse de que LessonID y QualifyingScore sean únicos.

En la columna QualifyingScore, usaría un minúsculo, y lo haría 0, 1, o 2. Eso, o podría hacer una columna QualifyingMinScore y QualifyingMaxScore para poder decir,

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

Saludos,
Eric

Otros consejos

No puede tener más de un enlace RI en cascada a una sola tabla en una tabla vinculada determinada. Microsoft explica esto:

  

Recibe este mensaje de error porque   en SQL Server, una tabla no puede aparecer   más de una vez en una lista de todos   las acciones referenciales en cascada que   son iniciados por DELETE o por   Declaración de ACTUALIZACIÓN. Por ejemplo, el   árbol de acciones referenciales en cascada   solo debe tener un camino a un   tabla particular en cascada   árbol de acciones referenciales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top