DROP IF EXISTS VS DROP?

186

有人能告诉我两者之间是否有任何区别吗?

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

我之所以提出这个问题,是因为我在我的MVC Web应用程序中使用JDBC模板。如果我使用DROP [TABLE_NAME],错误会说表已存在。但如果我使用DROP IF EXISTS [TABLE_NAME],它会显示坏的SQL语法。有人可以帮忙吗?


1
如果您正在寻找SQL Server语法,请访问此处:https://dev59.com/Amsz5IYBdhLWcg3wcnhb - Drew Delano
我认为这个问题应该有一个标签来指明具体的数据库。 - Tom Stickel
5个回答

332

标准 SQL 语法是

DROP TABLE table_name;

IF EXISTS不是标准语法;不同的平台可能支持不同的语法,也可能根本不支持。在PostgreSQL中,语法为:

DROP TABLE IF EXISTS table_name;

如果表不存在,或其他数据库对象依赖于它,第一种方法将会抛出错误。其中最常见的依赖可能是外键引用,但也可能包括其他对象(例如视图)。如果表不存在,第二种方法不会抛出错误,但如果其他数据库对象依赖于它仍然会抛出错误。

要删除一个表及其所有依赖项,请使用其中之一。

DROP TABLE table_name CASCADE;
DROP TABLE IF EXISTS table_name CASCADE;

使用CASCADE需要非常小心。


6
只是想提一下,在事务块(BEGIN...COMMIT)中使用CASCADE将是一个非常好的主意。这样,在潜在地覆盖一堆不希望被覆盖的数据之前,清楚地了解数据库将受到的影响。 - jbowman
3
SQL Server 2016中新增了DROP IF EXISTS(不含CASCADE)选项。详情请参见http://blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016.aspx。 - Jovan MSFT

38

虽然这不是直接要求的内容,但当我在寻找如何正确删除表时,我偶然发现了这个问题,我猜其他人也会遇到同样的情况。

从SQL Server 2016开始,您可以使用以下方法:

DROP TABLE IF EXISTS dbo.Table

对于SQL Server <2016,我通常会采取以下步骤来创建永久表:

IF OBJECT_ID('dbo.Table', 'U') IS NOT NULL 
  DROP TABLE dbo.Table; 

或者对于临时表,可以使用以下语句:
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

21

你的语法中忘记了table标签:

drop table [table_name]

删除表的方法。

使用:

drop table if exists [table_name]

在删除表之前检查它是否存在。
如果存在,则删除它。
如果不存在,则不会产生错误并且不会采取任何操作。


4
DROP TABLE IF EXISTS [table_name]

首先,它会检查表是否存在,如果存在则删除该表。

DROP TABLE [table_name]

该命令在没有检查的情况下进行删除操作,因此如果文件不存在,则会出现错误并退出。


4
如果不存在这样的表,DROP 将失败并显示错误,而 DROP IF EXISTS 则不会有任何操作。
如果您使用脚本创建/修改数据库,这将非常有用;这样您就不必手动确保删除了表的先前版本。您只需要执行 DROP IF EXISTS 并忘记它即可。
当然,您当前的数据库引擎可能不支持此选项,根据您提供的信息很难详细说明错误。

值得一提的是,一些关系型数据库管理系统(尤其是PostgreSQL)如果您尝试执行drop some_table if exists;但表some_table不存在,则会抛出警告。 - user554546
啊,当然 juegen d 和 Flakron 是对的。DROP 需要您指定对象的类型(在这种情况下为 TABLE)。 - SJuan76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接