首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SQL Server 2016语法,当表本身可能存在也可能不存在时,如何使用drop constraint 'if exists‘?

使用SQL Server 2016语法,当表本身可能存在也可能不存在时,如何使用drop constraint 'if exists‘?
EN

Stack Overflow用户
提问于 2019-12-10 18:21:26
回答 3查看 327关注 0票数 0

我已经研究了在SQL Server 2016中删除数据库项时如何测试表或约束的存在,并了解到可以使用'if exist‘语法。但我还没有弄清楚如何删除一个表的约束,然后删除表本身,在没有脚本错误的情况下,表本身可能存在也可能不存在。

代码语言:javascript
运行
复制
-- 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

在本例中,如果表不存在,脚本在尝试删除约束时将出错。

我应该如何编写脚本?

EN

回答 3

Stack Overflow用户

发布于 2019-12-10 18:40:36

您可以检查表是否如所述的here那样存在

在块中添加用于删除约束的代码,如下所示:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-12-10 20:25:07

首先,您不需要单独删除约束。它们将随表一起删除。

可以使用try/catch块单独删除每个约束。

因此,相当于您的if exists是:

代码语言:javascript
运行
复制
begin try
    alter table TABLE1 drop constraint F_TABLE1_COLUMN1;
end try
begin catch
end catch;

您还可以使用动态SQL删除表和所有关联的约束:

代码语言:javascript
运行
复制
exec sp_executesql 'drop table TABLE1';
票数 0
EN

Stack Overflow用户

发布于 2019-12-10 20:33:10

从SQL Server 2016开始,您可以使用DROP IF EXISTS语法。在继续删除约束table之前,首先检查表的存在。

代码语言:javascript
运行
复制
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

此外,如果您计划删除表,则不需要删除约束。您可以直接删除该表。下面就足够了。

代码语言:javascript
运行
复制
IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID('<TableName>'))
BEGIN
    DROP TABLE IF EXISTS <TableName>;
END
GO

但是,我建议您检查并删除与此表关联的外键,然后删除此表。否则你会得到错误。您可以在下面的脚本中检查与表关联的外键。首先,您需要删除它们,然后才能删除表。

代码语言:javascript
运行
复制
EXEC sp_fkeys [ @pktable_name = ] 'pktable_name'   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59264980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档