2014-01-10 3 views
1

Вчера я опубликовал эту проблему и ответа не получил. Прилагаю здесь образец моей проблемы. Я хочу создать эту БД:Ошибка в CASCADE в Sql - Server 2008

CREATE DATABASE [TRYShemen]; 
GO 
USE [TRYShemen] 
GO 
CREATE TABLE Persons( 
ID VARCHAR(50) PRIMARY KEY, 
FullName VARCHAR(50) NOT NULL 
); 



CREATE TABLE Class( 
ClassNum VARCHAR(30) PRIMARY KEY, 
Teacher VARCHAR(50) NOT NULL, 

constraint Class_FK foreign key (Teacher) references Persons (ID) ON DELETE NO ACTION ON UPDATE CASCADE, 

); 

CREATE TABLE Students(
StudentID VARCHAR(50) , 
ClassNum VARCHAR(30) 

constraint Students_PK PRIMARY KEY (StudentID, ClassNum), 

constraint Students_FK foreign key (StudentID) references Persons(ID) ON DELETE NO ACTION ON UPDATE CASCADE , 
constraint Students_FK1 foreign key (ClassNum) references Class(ClassNum) ON DELETE NO ACTION ON UPDATE CASCADE 
); 

и я получаю сообщение об ошибке:

Introducing FOREIGN KEY constraint 'Students_FK1' on table 'Students' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

Я знаю, что если я не изменить «Students_FK1» в КАСКАДНЫЙ NO ACTION, он будет работать, но это не так моя цель. Я хочу, чтобы, если идентификатор «Личность» будет обновляться, он также будет обновлен в таблице «Студенты».

как я могу его решить?

спасибо!

ответ

2

Так что вы можете сделать?

Рассмотрите эту структуру как альтернативу.

столовых чел
таблицы Студенты
столовые Учителя
столовых Классы
столовых Classes_to_Teachers
стол-Classes_to_Students

Тогда вы можете иметь ссылки каскадные для
лиц -> Студенты & Студенты -> Classes_to_Students
Люди -> Учителя & Преподаватели -> Classes_to_Teachers

Когда вы получаете доступ к своим данным, у вас будет больше объединений, чтобы получить все данные для одного класса. Но ограничения должны работать.

+0

Умный. Он также позволяет более одного учителя на класс. –

+1

Спасибо, @outisnihil. В самом деле. И если вы этого не хотите, user2097810, конечно, у вас может быть уникальное ограничение на оба столбца id в такой таблице Classes_to_Teachers, как вы четко знаете, как это сделать. –

+1

На самом деле еще более кратким было бы добавить «Тип» в таблицу лиц ... Тогда вам не понадобятся отдельные таблицы «Учителя» и «Студенты», а также только одна таблица ассоциаций «Classes_to_People». –

2

Обратите внимание, что в нем говорится, что «может вызвать циклы или несколько каскадных путей». Если вы выполните действие удаления через вашу диаграмму ER, вы, вероятно, обнаружите, что действие удаления каскадируется в одну и ту же таблицу с помощью нескольких маршрутов.

В этом случае представьте, что один и тот же человек является учителем и учеником в классе. Да, я знаю, это логическая ошибка, но если это условие было правдой, то обновление для этого человека было бы каскадом к таблице студентов через два маршрута.

+1

Действительно. И вы можете видеть, что db счастлив, если вы закомментируете одно из двух ограничений для Person. –

+0

Хорошо, я понимаю, но в моем случае невозможно, чтобы Человек был Учителем и Студентом. Есть способ изменить таблицы, которые помогают его решить? Спасибо! – user2097810

+0

Вам, вероятно, придется заменить ограничения внешнего ключа на пользовательские триггеры, чтобы управлять этим. –

Смежные вопросы