2014-10-29 143 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; 

我得到的外键的错误是:

消息1785,级别16,状态0,第1行
引进国外KEY约束 'fk_employee' 上表'员工'可能会导致周期或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

Msg 1750,Level 16,State 0,Line 1
无法创建约束。查看以前的错误。

+4

我不认为你可以使用CASCADE与自引用外键。 (事实上​​,我并不是一个非常喜欢使用CASCADE的人)。通常,删除拥有下属的员工的逻辑将以这样一种方式编写,即首先重新分配这些下属。 – 2014-10-29 17:42:22

+0

这是学校的一项任务,方向明确要求我以这种方式编写参考。 – Gunner89 2014-10-29 18:12:01

+0

好吧,那么这些信息必须以某种方式放在笔记或课程资源中,不是吗?或者,也许你的教师不太清楚SQL Server是如何工作的?你能告诉我们你的具体作业方向吗? (并不是说我们真的应该帮助你做家庭作业。) – 2014-10-29 18:19:35

回答

0

删除超级本地方存在上级

你不能对作为主诉由SQL Server DELETE CASCADE,因为它创造周期应该设定NULL值的所有行。

您需要创建出来的外键删除第

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

现在,你需要考虑如何设置监督员为NULL了上删除。你可以阅读关于这个触发器。

提示是在表上使用INSETAD OF DELETE触发器,并为已删除的管理员设置NULL值。

你可以通过阅读来书写触发器。