Введение ограничения ВНЕШНЕГО КЛЮЧА 'c_name' в таблицу 't_name' может привести к циклам или нескольким каскадным путям
-
03-07-2019 - |
Вопрос
У меня есть таблица базы данных под названием Lesson
:
столбцы: [LessonID, LessonNumber, Description]
... плюс несколько других колонок
У меня есть еще один столик под названием Lesson_ScoreBasedSelection
:
столбцы: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]
Когда урок завершен, его LessonID просматривается в Lesson_ScoreBasedSelection
приведите таблицу, чтобы получить три возможных следующих урока, каждый из которых связан с определенным диапазоном баллов.Если бы оценка была 0-33, использовался бы идентификатор урока, сохраненный в NextLessonID_1.Если оценка была 34-66, то использовался бы LessonID, сохраненный в NextLessonID_2, и так далее.
Я хочу ограничить все столбцы в Lesson_ScoreBasedSelection
таблица с внешними ключами, ссылающимися на столбец LessonID в таблице lesson, поскольку каждое значение в Lesson_ScoreBasedSelection
таблица должна содержать запись в столбце LessonID таблицы уроков.Я также хочу, чтобы были включены каскадные обновления, чтобы при изменении идентификатора урока в таблице уроков все ссылки на него в Lesson_ScoreBasedSelection
таблица обновляется.
Это конкретное каскадное обновление кажется очень простым, односторонним обновлением, но когда я пытаюсь применить ограничение внешнего ключа к каждому полю в Lesson_ScoreBasedSelection
таблица, ссылающаяся на поле LessonID в таблице уроков, я получаю сообщение об ошибке:
Ввод ограничения ВНЕШНЕГО КЛЮЧА 'c_name' для таблицы 'Lesson_ScoreBasedSelection
' может вызывать циклы или несколько каскадных путей.
Кто-нибудь может объяснить, почему я получаю эту ошибку или как я могу достичь ограничений и каскадного обновления, которые я описал?
Решение
Учитывая ограничение SQL Server на это, почему бы вам не решить эту проблему, создав таблицу с SelectionID (PK), LessonID, Next_LessonID, QualifyingScore в качестве столбцов.Используйте ограничение, чтобы гарантировать уникальность LessonID и QualifyingScore.
В столбце QualifyingScore я бы использовал tinyint и сделал бы его 0, 1 или 2.Это, или вы могли бы создать столбец QualifyingMinScore и QualifyingMaxScore, чтобы вы могли сказать,
SELECT * FROM NextLesson
WHERE LessonID = @MyLesson
AND QualifyingMinScore <= @MyScore
AND @MyScore <= QualifyingMaxScore
Ваше здоровье,
Эрик
Другие советы
У вас не может быть более одной каскадной ссылки RI на одну таблицу в любой данной связанной таблице. Майкрософт объясняет это:
Вы получаете это сообщение об ошибке, потому что в SQL Server таблица не может отображаться более одного раза в списке всех каскадных ссылочных действий, которые запускаются либо инструкцией DELETE, либо инструкцией UPDATE.Например, дерево каскадных ссылочных действий должно иметь только один путь к определенной таблице в дереве каскадных ссылочных действий.