删除具有主键的表,该主键具有对另一个表的外键引用

时间:2014-05-13 20:51:52

标签: sql sql-server

有没有办法删除具有主键的表并在另一个表上使用外键引用?我知道,如果我试着写一个简单的DROP语句,那么 SSMS 会让我异常说

Msg 3726, Level 16, State 1, Line 1
Could not drop object 'dbo.Dept' because it is referenced by a FOREIGN KEY constraint.

可能答案只是但是,我正在寻找任何解决方案,因为最近我在面试时被问到这个问题。

3 个答案:

答案 0 :(得分:2)

您必须将CONSTRAINT放在(子)表上。这会保留子表,但会破坏父表的“链接”。

这就是为什么我喜欢命名我的约束。 (在这种情况下为“FK_EmployeeToDepartment”)。

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
BEGIN DROP TABLE [dbo].[Employee] 
END 


IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[Department]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
BEGIN DROP TABLE [dbo].[Department] 
END 


CREATE TABLE [dbo].[Department](
    [DepartmentUUID] [uniqueidentifier] NOT NULL,
    [DepartmentName] [nvarchar](80) NULL,
    [CreateDate] [datetime] NOT NULL
    )


ALTER TABLE dbo.[Department] ADD CONSTRAINT PK_Department PRIMARY KEY NONCLUSTERED ([DepartmentUUID]) 
GO

ALTER TABLE [dbo].[Department] ADD CONSTRAINT CK_DepartmentName_Unique UNIQUE ([DepartmentName]) 
GO


CREATE TABLE [dbo].[Employee] ( 

    [EmployeeUUID] [uniqueidentifier] NOT NULL,
    [ParentDepartmentUUID] [uniqueidentifier] NOT NULL,
    [SSN] [nvarchar](11) NOT NULL,
    [LastName] [varchar](64) NOT NULL,
    [FirstName] [varchar](64) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [HireDate] [datetime] NOT NULL
    )

GO

ALTER TABLE dbo.Employee ADD CONSTRAINT PK_Employee PRIMARY KEY NONCLUSTERED (EmployeeUUID) 
GO


ALTER TABLE [dbo].[Employee] ADD CONSTRAINT CK_SSN_Unique UNIQUE (SSN) 
GO

ALTER TABLE [dbo].[Employee] ADD CONSTRAINT FK_EmployeeToDepartment FOREIGN KEY (ParentDepartmentUUID) REFERENCES dbo.Department (DepartmentUUID) 
GO

/* this will fail here */
--DROP TABLE [dbo].[Department] 
GO

/* drop the constraint */
ALTER TABLE [dbo].[Employee] DROP CONSTRAINT FK_EmployeeToDepartment 
GO

/* now it will work */
DROP TABLE [dbo].[Department] 
GO

答案 1 :(得分:0)

首先删除引用的表,然后删除父表。这就是创建参考时的原因,您应该选择ON DELETE CASCADE和/或ON UPDATE CASCADE

它故意抛出这个错误并阻止你犯下引用表Orphan / Zombie的错误。

答案 2 :(得分:0)

如果你真的打算删除一个被外键约束引用的表,那么外键约束就不再有意义了,对吧?首先删除外键约束,然后删除表。

create table foo (
  foo_id integer primary key
);

create table bar (
  bar_id integer not null,
  foo_id integer not null,
  constraint bar_foo_id_fkey 
    foreign key (foo_id)
    references foo (foo_id),
  primary key (bar_id, foo_id)
);

drop table foo;  -- Results in an error because of the foreign key constraint.

alter table bar
drop constraint bar_foo_id_fkey;

drop table foo;  -- Drops table "foo".

您可能仍需要处理有关列的存在" bar"。" foo_id"以及关于" bar"中的主键。