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
-
03-07-2019 - |
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í?
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.