我已经研究了在SQL Server 2016中删除数据库项时如何测试表或约束的存在,并了解到可以使用'if exist‘语法。但我还没有弄清楚如何删除一个表的约束,然后删除表本身,在没有脚本错误的情况下,表本身可能存在也可能不存在。
-- Drop TABLE1
alter table TABLE1 drop constraint if exists F_TABLE1_COLUMN1
go
alter table TABLE1 drop constraint if exists F_TABLE1_COLUMN2
go
alter table TABLE1 drop constraint if exists P_TABLE1_COLUMN2
go
drop table if exists TABLE1
go
在本例中,如果表不存在,脚本在尝试删除约束时将出错。
我应该如何编写脚本?
发布于 2019-12-10 18:40:36
您可以检查表是否如所述的here那样存在
在块中添加用于删除约束的代码,如下所示:
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = <table_name>))
BEGIN
ALTER TABLE <table_name>
DROP CONSTRAINT <Constraint_name>;
END
发布于 2019-12-10 20:25:07
首先,您不需要单独删除约束。它们将随表一起删除。
可以使用try
/catch
块单独删除每个约束。
因此,相当于您的if exists
是:
begin try
alter table TABLE1 drop constraint F_TABLE1_COLUMN1;
end try
begin catch
end catch;
您还可以使用动态SQL删除表和所有关联的约束:
exec sp_executesql 'drop table TABLE1';
发布于 2019-12-10 20:33:10
从SQL Server 2016开始,您可以使用DROP IF EXISTS语法。在继续删除约束table之前,首先检查表的存在。
IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID('<TableName>'))
BEGIN
ALTER TABLE <TableName> DROP CONSTRAINT IF EXISTS <CONSTRAINTNAME>;
DROP TABLE IF EXISTS <TableName>;
END
GO
此外,如果您计划删除表,则不需要删除约束。您可以直接删除该表。下面就足够了。
IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID('<TableName>'))
BEGIN
DROP TABLE IF EXISTS <TableName>;
END
GO
但是,我建议您检查并删除与此表关联的外键,然后删除此表。否则你会得到错误。您可以在下面的脚本中检查与表关联的外键。首先,您需要删除它们,然后才能删除表。
EXEC sp_fkeys [ @pktable_name = ] 'pktable_name'
https://stackoverflow.com/questions/59264980
复制相似问题