2010-06-18 2 views
0

Здравствуйте, друзья Я получаю следующее сообщение об ошибке в то время как делает «tbl_course» таблицы внешнего ключаОшибка в SQL Server

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

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

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

+3

Вы должны показать предложение, которое вы используете для создания своей таблицы: «create table tbl_course ...». В противном случае вам просто невозможно помочь. –

+4

Святой поток сознания - вам нужно использовать небольшую пунктуацию, а также пример или два. –

ответ

2

Согласно MS

Вы получаете сообщение об ошибке, потому что в 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 

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

+0

Да, если я не устанавливаю каскадный, тогда он работает, но без этого ничего не получается .... – NoviceToDotNet

+2

Ну, боюсь, сервер sql не позволит вам. Вы можете использовать триггер, если вам действительно нужна каскадная функциональность на уровне базы данных. – Gratzy

+0

Gratzy ..trigger u испугался меня .. я никогда не использовал это, может предложить мне, как использовать его, чтобы избавиться от этой проблемы ... – NoviceToDotNet

1

Зачем вам добавлять что-либо, кроме 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 (или любым другим основным ключом, который вы используете, но я использую это для целей иллюстраций), то они должны быть в курсах 1 и College1. Добавляя дополнительную информацию к записи Student, вы не только создаете циклические ссылки в коде, но и ставите себя в положение, чтобы создать «поврежденную» запись в базе данных.Конечно, вы можете это кодировать, но зачем прикладывать дополнительные усилия, когда вы можете упростить запись студента просто (Student1, Branch1), не теряя никаких данных?

Это известно как database normalization, и это очень важно, по крайней мере, рассмотреть, когда вы строите модель данных.

+0

Kendrick ... student table имеет информацию о студенте, которая содержит student_id как первичный ключ, у нее также есть colleg_id branch_id и course_id .... я хочу, если collge_id будет удален, запись в этот колледж из таблицы учеников должна быть удалена одинаково для идентификатора курса и филиала ... – NoviceToDotNet

+1

Если у вас есть ученики, которые прошли занятия в определенной ветви, вы определенно НЕ хотите удалить колледж, вы хотите пометить его как неактивен или вы потеряете свою историю, и я был бы очень злим на вас, если бы взял курс в филиале A, а затем это не было в моей расшифровке, и я не мог окончить учебу, потому что вы удалили посещаемость моего курса, когда вы закрыли филиал , – HLGEM

+0

comment contnued Это как удаление части из заказа, который был заполнен в прошлом, когда часть больше не доступна для покупки. Он все еще был куплен в прошлом. Использование каскадных удалений (или триггера) для такой функции опасно. Вы полностью уничтожаете любую целостность данных, которую вы имели. Исторические записи никогда не должны удаляться, если сущность, которую они использовали, больше не существует. – HLGEM