Ошибка от SQL Server - PullRequest
       0

Ошибка от SQL Server

0 голосов
/ 18 июня 2010

Здравствуйте, друзья, я получаю следующую ошибку при создании внешнего ключа

Таблица 'tbl_course' успешно сохранена таблица 'tbl_students' - Невозможно создать отношение 'FK_tbl_students_tbl_course'.
Введение ограничения FOREIGN KEY 'FK_tbl_students_tbl_course' на столе 'tbl_students' может вызвать циклы или несколько каскадных путей. Укажите ПО УДАЛИТЬ НЕТ ДЕЙСТВИЙ или ОБНОВЛЕНИЕ НЕТ ДЕЙСТВИЕ, или измените другой ИНОСТРАННЫЙ КЛЮЧ ограничения. Не удалось создать ограничение. Смотрите предыдущие ошибки.

У меня есть следующие таблицы College таблица, Branch таблица, Course таблица и Student таблица

Course имеет внешний ключ college_id, Branch имеет внешний ключ course_id, и я хочу сделать college_id, course_id, branch_id в качестве внешних ключей для моей таблицы Student, но делая course_id и branch_id в качестве внешнего ключа в таблице Student, генерируется ошибка, упомянутая выше ... пожалуйста, помогите мне решить вышеуказанную проблему ..... спасибо

Ответы [ 2 ]

2 голосов
/ 18 июня 2010

По МС

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

http://support.microsoft.com/kb/321843

Можете ли вы жить без каскадных удалений? Сохраняйте ссылочную интегральность, но не ссылочные действия (каскады). При необходимости вы можете прибегнуть к триггеру в качестве обходного пути.

EDIT:

CREATE TRIGGER [dbo].[tr_College_Delete] ON [dbo].[College] 
FOR  DELETE 
AS 
BEGIN 
    DELETE  FROM student 
    where collegeid in (select collegeid from deleted) 

END 

не тестировался.

1 голос
/ 18 июня 2010

Зачем вы добавляете что-нибудь, кроме branch_id к студенту? Оттуда вы сможете определить, к какому курсу относится филиал и к какому колледжу относится курс.

Если у вас есть

College
College1
College2
College3

Course
Course1, College1
Course2, College1
Course3, College2

Branch
Branch1, Course1
Branch2, Course1
Branch3, Course2

Student
Student1,College3,Course3,Branch1

Это действительно с точки зрения базы данных, но не имеет смысла, так как запись студента должна быть прикреплена к College1 на основе филиала, к которому она прикреплена. Вы логично знаете, что если учащийся находится в отделении с идентификатором Branch1 (или любым другим первичным ключом, который вы используете, но я использую его для иллюстративных целей), то он должен быть в Course1 и College1. Добавляя дополнительную информацию в запись ученика, вы не только создаете циклические ссылки в коде, но и можете создать «поврежденную» запись в базе данных. Конечно, вы можете обойти это, но зачем тратить дополнительные усилия, если вы можете упростить запись студента до простой (Student1, Branch1) без потери каких-либо данных?

Это известно как нормализация базы данных , и это очень важно, по крайней мере, учитывать при построении модели данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...