有没有办法删除具有主键的表并在另一个表上使用外键引用?我知道,如果我试着写一个简单的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.
可能答案只是否但是,我正在寻找任何解决方案,因为最近我在面试时被问到这个问题。
答案 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"中的主键。