【问题标题】:SQL Server 2008 Foreign Key errorSQL Server 2008 外键错误
【发布时间】:2014-12-25 13:26:20
【问题描述】:

创建表后,我尝试输入主键和外键。但是,我的外键有问题,不胜感激!这是我的代码:

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 行
在表“EMPLOYEE”上引入 FOREIGN KEY 约束“fk_employee”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

消息 1750,第 16 级,状态 0,第 1 行
无法创建约束。查看以前的错误。

【问题讨论】:

  • 我认为您不能将 CASCADE 与自引用外键一起使用。 (事实上​​,我从来都不是使用 CASCADE 的忠实拥护者。)通常情况下,删除有下属的员工的逻辑会以 首先 重新分配这些下属的方式编写。
  • 这是给学校的作业,方向特别要求我这样写参考。
  • 好的,那么这些信息必须以某种方式出现在您的笔记或课堂资源中,不是吗?或者您的讲师可能不太了解 SQL Server 的工作原理?你能告诉我们你确切的作业指导吗? (并不是说我们真的应该帮助你完成作业。)

标签: sql-server sql-server-2008


【解决方案1】:

删除主管应将 NULL 值设置为该主管所在的所有行

您不能像 SQL Server 抱怨的那样使用 ON DELETE CASCADE,因为它会创建循环。

您需要创建没有 ON DELETE 子句的外键

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

现在您需要考虑如何在删除时将主管设置为 NULL。您可以阅读有关此触发器的信息。

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

您可以通过阅读来编写触发器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多