2014-10-29 2 views
0

Я попытался ввести мои первичные и внешние ключи после создания моей таблицы. Однако у меня проблема с моим внешним ключом, и я буду признателен за любую помощь! Вот мой код:Ошибка внешнего ключа SQL Server 2008

Create Table EMPLOYEE 
(
    SSN_Number CHAR(9) NOT NULL, 
    First_Name Varchar(15)NOT NULL, 
    Mid_Name Char, 
    Last_Name Varchar(15) NOT NULL, 
    Birthday Date, 
    Address Varchar(50), 
    Gender Char, 
    Salary Money default 8000, 
    Supervisor_SSN Char(9), 
    Department_Number int 
); 

ALTER TABLE EMPLOYEE 
ADD CONSTRAINT pk_employee PRIMARY KEY (SSN_Number); 
ADD CONSTRAINT ck_employee CHECK (Gender IN ('M', 'm', 'F', 'f')) 
ADD CONSTRAINT fk_employee FOREIGN KEY (Supervisor_SSN) REFERENCES employee (SSN_Number) ON DELETE SET NULL; 

Я получаю ошибку для внешнего ключа:

Msg 1785, уровень 16, состояние 0, строка 1
Вводя ограничение внешнего ключа 'fk_employee' на столе «EMPLOYEE» может вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.

Msg 1750, Level 16, State 0, Line 1
Не удалось создать ограничение. См. Предыдущие ошибки.

+4

Я не думаю, что вы можете использовать CASCADE с внешним ключом для самостоятельной ссылки. (На самом деле, я не большой поклонник использования CASCADE когда-либо.) Обычно ваша логика для удаления сотрудника, у которого есть подчиненные, будет написана таким образом, что * first * он повторно назначает этих подчиненных. –

+0

Это задание для школы, и направления специально просят меня написать ссылку таким образом. – Gunner89

+0

Итак, эта информация должна быть в ваших заметках или в ресурсах класса каким-то образом, нет? Или, может быть, ваши инструкторы не знают, как работает SQL Server? Можете ли вы показать нам свои точные домашние задания? (Не то, чтобы мы действительно хотели помочь вам с вашей домашней работой.) –

ответ

0

Удаление супервизора следует установить NULL значения для всех строк, где этот наблюдатель существует

Вы не можете иметь ON DELETE CASCADE, как пожаловалась на SQL Server, поскольку он создает циклы.

вам нужно создать внешний ключ с вне ON DELETE п

ALTER TABLE EMPLOYEE ADD CONSTRAINT 
     fk_employee FOREIGN KEY (Supervisor_SSN) REFERENCES employee (SSN_Number) ; 

Теперь вы должны думать, как установить супервизор NULL на удалении. вы можете прочитать о триггерах для этого.

Подсказка - это использование триггера INSETAD OF DELETE на столе и установка значения NULL для удаленного супервизора.

Вы можете написать триггер, прочитав.

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