TROPFEN, WENN EXISTIERT GEGEN TROPFEN?

163

Kann mir jemand sagen, ob es einen Unterschied gibt zwischen

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Ich frage dies, weil ich die JDBC-Vorlage in meiner MVC-Webanwendung verwende. Wenn ich DROP [TABLE_NAME]den Fehler benutze , sagte diese Tabelle vorhanden. Und wenn ich es benutze DROP IF EXISTS [TABLE_NAME], steht schlechte SQL-Grammatik. Kann jemand helfen?

AbdulAziz
quelle
1
Wenn Sie nach der SQL Server-Grammatik suchen, finden Sie sie hier: stackoverflow.com/questions/7887011/…
Drew Delano
Ich denke, dies sollte ein Tag auf Frage für welche spezifische Datenbank haben.
Tom Stickel

Antworten:

293

Standard SQL Syntax ist

DROP TABLE table_name;

IF EXISTSist nicht Standard; Verschiedene Plattformen unterstützen es möglicherweise mit unterschiedlicher Syntax oder überhaupt nicht. In PostgreSQL lautet die Syntax

DROP TABLE IF EXISTS table_name;

Der erste gibt einen Fehler aus, wenn die Tabelle nicht vorhanden ist oder wenn andere Datenbankobjekte davon abhängen. In den meisten Fällen handelt es sich bei den anderen Datenbankobjekten um Fremdschlüsselreferenzen, möglicherweise jedoch auch um andere. (Ansichten zum Beispiel.) Die zweite gibt keinen Fehler aus, wenn die Tabelle nicht vorhanden ist, aber sie gibt trotzdem einen Fehler aus, wenn andere Datenbankobjekte davon abhängen.

Verwenden Sie eines dieser Elemente, um eine Tabelle und alle anderen davon abhängigen Objekte zu löschen.

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

Verwenden Sie CASCADE mit großer Sorgfalt.

Mike Sherrill 'Cat Recall'
quelle
6
Ich dachte nur, ich würde erwähnen, dass es eine wirklich gute Idee wäre, sie CASCADEinnerhalb eines Transaktionsblocks zu verwenden ( BEGIN... COMMIT). Auf diese Weise ist klar, wie die Datenbank beeinflusst wird, bevor möglicherweise eine Reihe von Daten überlastet werden, die Sie möglicherweise nicht wollten.
Jbowman
3
DROP IF EXISTS (ohne CASCADE) wird auch in SQL Server 2016 hinzugefügt. Siehe blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT
35

Es ist nicht das, was direkt gefragt wird. Aber als ich suchte, wie man Tische richtig fallen lässt, stolperte ich über diese Frage, wie ich denke, viele andere auch.

Ab SQL Server 2016+ können Sie verwenden

DROP TABLE IF EXISTS dbo.Table

Für SQL Server <2016 mache ich Folgendes für eine permanente Tabelle

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

Oder dies für eine temporäre Tabelle

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

Sie haben das tablein Ihrer Syntax vergessen :

drop table [table_name]

das lässt einen Tisch fallen.

Verwenden von

drop table if exists [table_name]

Überprüft, ob die Tabelle vorhanden ist, bevor sie gelöscht wird.
Wenn es existiert, wird es fallen gelassen.
Wenn nicht, wird kein Fehler ausgegeben und es werden keine Maßnahmen ergriffen.

Jürgen d
quelle
4
DROP TABLE IF EXISTS [table_name]

Zunächst wird geprüft, ob die Tabelle vorhanden ist. Wenn dies der Fall ist, wird die Tabelle währenddessen gelöscht

DROP TABLE [table_name]

Es wird ohne Überprüfung gelöscht. Wenn es nicht vorhanden ist, wird es mit einem Fehler beendet

Flakron Bytyqi
quelle
3

Wenn keine Tabelle mit einem solchen Namen vorhanden ist, DROPschlägt dies mit einem Fehler fehl, während DROP IF EXISTSnur nichts ausgeführt wird.

Dies ist nützlich, wenn Sie Ihre Datenbank mit einem Skript erstellen / ändern. Auf diese Weise müssen Sie nicht manuell sicherstellen, dass frühere Versionen der Tabelle gelöscht werden. Du machst einfach eineDROP IF EXISTS und vergisst es.

Natürlich unterstützt Ihre aktuelle DB-Engine diese Option möglicherweise nicht. Es ist schwierig, anhand der von Ihnen angegebenen Informationen mehr über den Fehler zu erfahren.

SJuan76
quelle
Es kann auch erwähnenswert sein, dass einige RDBMS (insbesondere PostgreSQL) eine Warnung auslösen, wenn Sie es versuchen drop some_table if exists;und die Tabelle some_tablenicht existiert.
Ah, und natürlich haben juegen d und Flakron recht. DROPmuss, dass Sie den Objekttyp angeben ( TABLEin diesem Fall)
SJuan76