存在する場合のドロップとドロップの場合


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
Drew Delano

これには、特定のデータベースに関するタグが必要です。
Tom Stickel

回答:


293

標準SQL構文は

DROP TABLE table_name;

IF EXISTS標準ではありません。プラットフォームが異なれば、構文が異なる場合もあれば、まったくサポートされない場合もあります。PostgreSQLでは、構文は次のとおりです。

DROP TABLE IF EXISTS table_name;

最初のテーブルは、テーブルが存在しない場合、または他のデータベースオブジェクトがそれに依存している場合にエラーをスローします。ほとんどの場合、他のデータベースオブジェクトは外部キー参照になりますが、他にも存在する可能性があります。(たとえば、ビュー。)2番目は、テーブルが存在しない場合はエラーをスローしませんが、他のデータベースオブジェクトがそれに依存している場合はエラーをスローします。

テーブル、およびテーブルに依存する他のすべてのオブジェクトを削除するには、これらのいずれかを使用します。

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

CASCADEは慎重に使用してください。


6
トランザクションブロック(... )内で使用するのは本当に 良いアイデアだと私が言及したいと思っただけです。このようにして、不要なデータの束を潜在的に破壊する前に、データベースがどのように影響を受けるかが明確になります。CASCADEBEGINCOMMIT
jbowman

3
DROP IF EXISTS(CASCADEなし)もSQL Server 2016に追加されています。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それを忘れます。

もちろん、現在のDBエンジンはこのオプションをサポートしていない可能性があります。提供した情報でエラーの詳細を知ることは困難です。


また、いくつかのRDBMS(特にPostgreSQL)がdrop some_table if exists;、テーブルsome_tableが存在しない場合に警告をスローすることにも言及する価値があります。

ああ、もちろん、juegen dとFlakronは正しい。DROPオブジェクトのタイプ(TABLEこの場合)を指定する必要があります
SJuan76
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.