如果存在,则丢弃VS丢弃?


163

有人可以告诉我两者之间是否有区别

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

我问这是因为我在MVC Web应用程序中使用JDBC模板。如果使用DROP [TABLE_NAME]错误,则表示该表存在。如果我使用DROP IF EXISTS [TABLE_NAME]它,则表示SQL语法错误。可以帮忙吗?


1
如果你正在寻找的SQL Server的语法,它在这里:stackoverflow.com/questions/7887011/...
德鲁·德拉诺·

我认为这应该对哪个特定数据库有疑问。
汤姆·斯蒂克

Answers:


293

标准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
只是以为我要提到,在事务块(... )中使用它是一个非常 好的主意。这样,潜在破坏大量您可能不希望使用的数据之前,很明显将如何影响数据库。CASCADEBEGINCOMMIT
jbowman 2015年

3
SQL Server 2016中也添加了DROP IF EXISTS(无CASCADE)。请参阅blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…–
Jovan MSFT

35

这不是直接问的。但是在寻找如何正确放置表的过程中,我偶然发现了这个问题,因为我猜很多其他人也这样做。

在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; 

17

table在语法中忘记了 :

drop table [table_name]

放一张桌子。

使用

drop table if exists [table_name]

在删除表之前检查表是否存在。
如果存在,它将被丢弃。
如果没有,则不会引发任何错误,也不会采取任何措施。


4
DROP TABLE IF EXISTS [table_name]

它首先检查表是否存在,如果存在,则删除表,同时

DROP TABLE [table_name]

它不经检查即删除,因此如果不存在则退出并显示错误


3

如果不存在具有该名称的表,则DROP失败,但DROP IF EXISTS不执行任何操作。

如果您使用脚本创建/修改数据库,这将很有用;这样,您不必手动确保删除表的先前版本。您只需做一个,DROP IF EXISTS然后就忘了它。

当然,您当前的数据库引擎可能不支持此选项,很难通过您提供的信息来进一步了解该错误。


可能还值得一提的是,如果尝试drop some_table if exists;但表some_table不存在,则某些RDBMS(尤其是PostgreSQL)会发出警告。

嗯,juegen d和Flakron当然是对的。DROP需要您指定对象的类型(TABLE在这种情况下)
SJuan76'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.