Введение ограничения FOREIGN KEY 'c_name' в таблице 't_name' может вызвать циклы или несколько каскадных путей

У меня есть таблица базы данных под названием Lesson:
columns: [LessonID, LessonNumber, Description] ... плюс некоторые другие столбцы

У меня есть еще одна таблица с названием Lesson_ScoreBasedSelection:
columns: [LessonID,NextLessonID_1,NextLessonID_2,NextLessonID_3]

Когда урок завершен, его LessonID ищется в таблице Lesson_ScoreBasedSelection, чтобы получить три возможных следующих урока, каждый из которых связан с определенным диапазоном баллов. Если оценка была 0-33, будет использоваться LessonID, хранящийся в NextLessonID_1. Если оценка была 34-66, будет использоваться LessonID, хранящийся в NextLessonID_2, и так далее.

Я хочу ограничить все столбцы в таблице Lesson_ScoreBasedSelection внешними ключами, ссылающимися на столбец LessonID в таблице уроков, поскольку каждое значение в таблице Lesson_ScoreBasedSelection должно иметь запись в столбце LessonID таблицы Lesson. Я также хочу, чтобы были включены каскадные обновления, чтобы при изменении LessonID в таблице Lesson обновлялись все ссылки на него в таблице Lesson_ScoreBasedSelection.

Это конкретное каскадное обновление кажется очень простым односторонним обновлением, но когда я пытаюсь применить ограничение внешнего ключа к каждому полю в таблице Lesson_ScoreBasedSelection, ссылающейся на поле LessonID в таблице уроков, я получаю сообщение об ошибке:

Введение ограничения FOREIGN KEY 'c_name' в таблице 'Lesson_ScoreBasedSelection' может вызвать циклы или несколько каскадных путей.

Может ли кто-нибудь объяснить, почему я получаю эту ошибку или как я могу достичь описанных мной ограничений и каскадного обновления?


person Triynko    schedule 29.04.2009    source источник


Ответы (2)


Учитывая ограничение 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

Приветствую,
Эрик

person Eric    schedule 29.04.2009
comment
Это отличная идея. Я также мог бы объединить поля в таблицу Lesson, поскольку это, по сути, взаимно-однозначное отношение, но я не хотел загромождать таблицу Lesson и усложнять ее запросы на обновление. Он был настроен как есть просто потому, что его легко просматривать и заполнять данными прямо в SQL Server Management Studio, поскольку он напоминал электронную таблицу, из которой исходят данные. В любом случае, ваше решение, вероятно, является наилучшим из возможных, и оно позволяет явно указывать оценки и гибко настраивать их для каждого урока. Думаю, я ничего не могу поделать с ограничениями SQL Server. - person Triynko; 30.04.2009

У вас не может быть более одной каскадной ссылки RI на одну таблицу в любой данной связанной таблице. Microsoft объясняет это:

Вы получаете это сообщение об ошибке, потому что в SQL Server таблица не может появляться более одного раза в списке всех каскадных ссылочных действий, которые запускаются оператором DELETE или UPDATE. Например, дерево каскадных ссылочных действий должно иметь только один путь к определенной таблице в дереве каскадных ссылочных действий.

person mwigdahl    schedule 29.04.2009
comment
Я понял, в чем была ошибка, я просто не понимаю, почему они так упрощенно реализовали обнаружение цикла, что в нем неверно указано, что моя ссылка может вызывать циклы или несколько каскадных путей, когда это может быть показано через направленный граф зависимостей, что это не так. вызвать любые такие циклы. Реализация, которую использует Microsoft, похоже, не учитывает направление отношений или зависимостей, поэтому она не определяет реальные циклы, а скорее их возможность. Возможно, это реализовано так из-за возможности срабатывания триггеров или чего-то в этом роде ... - person Triynko; 05.03.2012