DROP IF EXISTS VS DROP?

163

Quelqu'un peut-il me dire s'il y a une différence entre

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Je demande cela parce que j'utilise le modèle JDBC dans mon application Web MVC. Si j'utilise DROP [TABLE_NAME]l'erreur dit que la table existe. Et si je l'utilise, DROP IF EXISTS [TABLE_NAME]cela dit une mauvaise grammaire SQL. Quelqu'un peut-il aider?

AbdulAziz
la source
1
Si vous recherchez la grammaire SQL Server, c'est ici: stackoverflow.com/questions/7887011/…
Drew Delano
Je pense que cela devrait avoir une balise sur la question de quelle base de données spécifique.
Tom Stickel

Réponses:

293

La syntaxe SQL standard est

DROP TABLE table_name;

IF EXISTSn'est pas standard; différentes plates-formes peuvent le prendre en charge avec une syntaxe différente, ou ne pas le supporter du tout. Dans PostgreSQL, la syntaxe est

DROP TABLE IF EXISTS table_name;

Le premier lancera une erreur si la table n'existe pas ou si d'autres objets de base de données en dépendent. Le plus souvent, les autres objets de base de données seront des références de clé étrangère, mais il peut y en avoir d'autres également. (Vues, ​​par exemple.) Le second ne lèvera pas d'erreur si la table n'existe pas, mais il lèvera toujours une erreur si d'autres objets de base de données en dépendent.

Pour supprimer une table et tous les autres objets qui en dépendent, utilisez l'un d'entre eux.

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

Utilisez CASCADE avec grand soin.

Mike Sherrill 'Rappel de chat'
la source
6
Je pensais juste que je mentionnerais que ce serait une très bonne idée à utiliser CASCADEdans un bloc de transaction ( BEGIN... COMMIT). De cette façon, il est clair comment la base de données sera affectée avant de potentiellement écraser un tas de données que vous n'auriez peut-être pas voulu.
jbowman
3
DROP IF EXISTS (sans CASCADE) est également ajouté dans SQL Server 2016. Voir blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT
35

Ce n'est pas ce qui est demandé directement. Mais en cherchant comment faire correctement les tables de dépôt, je suis tombé sur cette question, comme je suppose que beaucoup d'autres le font aussi.

À partir de SQL Server 2016+, vous pouvez utiliser

DROP TABLE IF EXISTS dbo.Table

Pour SQL Server <2016, ce que je fais est ce qui suit pour une table permanente

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

Ou ceci, pour une table temporaire

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 
Squazz
la source
17

Vous avez oublié le tabledans votre syntaxe:

drop table [table_name]

qui fait tomber une table.

En utilisant

drop table if exists [table_name]

vérifie si la table existe avant de la supprimer.
S'il existe, il est abandonné.
Sinon, aucune erreur ne sera générée et aucune action ne sera entreprise.

juergen d
la source
4
DROP TABLE IF EXISTS [table_name]

il vérifie d'abord si la table existe, s'il le fait, il supprime la table en

DROP TABLE [table_name]

il supprime sans vérification, donc s'il n'existe pas il se termine avec une erreur

Flakron Bytyqi
la source
3

Si aucune table avec un tel nom n'existe, DROPéchoue avec une erreur alors DROP IF EXISTSque ne fait rien.

Ceci est utile si vous créez / modifiez votre base de données avec un script; de cette façon, vous n'avez pas à vous assurer manuellement que les versions précédentes du tableau sont supprimées. Vous faites juste un DROP IF EXISTSet oubliez ça.

Bien sûr, votre moteur de base de données actuel peut ne pas prendre en charge cette option, il est difficile d'en dire plus sur l'erreur avec les informations que vous fournissez.

SJuan76
la source
Il peut également être intéressant de mentionner que certains SGBDR (PostgreSQL en particulier) lancent un avertissement si vous essayez drop some_table if exists;et que la table some_tablen'existe pas.
Ah, et bien sûr juegen d et Flakron ont raison. DROPa besoin que vous spécifiiez le type d'objet ( TABLEdans ce cas)
SJuan76