Введение ограничения ВНЕШНЕГО КЛЮЧА 'c_name' в таблицу 't_name' может привести к циклам или нескольким каскадным путям

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

Вопрос

У меня есть таблица базы данных под названием 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.Например, дерево каскадных ссылочных действий должно иметь только один путь к определенной таблице в дереве каскадных ссылочных действий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top