Wenn Sie in SQL eine Tabelle aus einer Datenbank entfernen möchten, müssen Sie DROP TABLE
verwenden Erklärung.
Das zerstört die Tabelle und alle ihre Daten.
Syntax
Die SQL-Standardsyntax lautet wie folgt:
DROP TABLE <table name> <drop behavior>
Wo:
ist der Name der Tabelle, die Sie löschen möchten.
gibt alle Optionen an. Diese können entwederCASCADE
sein oderEINSCHRÄNKT
.
Einige RDBMSs akzeptieren auch einen optionalen IF EXISTS
Argument, was bedeutet, dass es keinen Fehler zurückgibt, wenn die Tabelle nicht existiert.
Einige RDBMS (wie MySQL und MariaDB) akzeptieren auch einen optionalen TEMPORARY
Schlüsselwort, um sicherzustellen, dass nur temporäre Tabellen gelöscht werden.
Oracle akzeptiert auch ein PURGE
Klausel, die es aus dem Papierkorb löscht.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung.
DROP TABLE t1;
Das Ausführen dieses Codes löscht die Tabelle namens t1
und all seine Daten.
Der IF EXISTS
Klausel
Hier ist ein Beispiel für die Verwendung von IF EXISTS
-Klausel, um zu prüfen, ob die Tabelle bereits existiert.
DROP TABLE IF EXISTS t1;
Verwenden von IF EXISTS
stellt sicher, dass wir keinen Fehler erhalten, wenn die Tabelle nicht existiert.
Folgendes passiert, wenn wir IF EXISTS
entfernen aus der Anweisung:
DROP TABLE t1;
Ergebnis:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Das ist die Nachricht, die von SQL Server zurückgegeben wird. Ihre Nachricht hängt von dem DBMS ab, das Sie verwenden.
Abhängige Fremdschlüssel und Ansichten
Einige RDBMSs erlauben ein optionales RESTRICT
oder KASKADE
Schlüsselwort, das angibt, was passiert, wenn die Tabelle Fremdschlüssel oder Ansichten enthält, die darauf verweisen.
Das RESTRICT
Möglichkeit
Hier ist ein Beispiel für die Verwendung von RESTRICT
beim Versuch, eine Tabelle zu löschen, die von einem Fremdschlüssel in einer anderen Tabelle referenziert wird:
DROP TABLE t1 RESTRICT;
Ergebnis:
cannot drop table t1 because other objects depend on it
Dieses Beispiel wurde mit PostgreSQL erstellt. EINSCHRÄNKUNG
ist die Standardoption, sodass wir dasselbe Ergebnis erhalten hätten, selbst wenn wir RESTRICT
nicht eingefügt hätten Schlüsselwort.
Die KASKADE
Möglichkeit
Folgendes passiert, wenn wir zu CASCADE
wechseln beim Versuch, dieselbe Tabelle zu löschen (die von einem Fremdschlüssel in einer anderen Tabelle referenziert wird):
DROP TABLE t1 CASCADE;
Ergebnis:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Dadurch wurde der Fremdschlüssel gelöscht, der auf unseren t1
verwies Tisch. Der Fremdschlüssel hieß t2_c2_fkey
.
Beachten Sie, dass die Tabelle mit dem Fremdschlüssel nicht gelöscht wurde. Es hat nur den Fremdschlüssel gelöscht.
Wenn die Zieltabelle (t1
) von Ansichten referenziert wurde, wäre die gesamte Ansicht gelöscht worden.
Sie müssen CASCADE
nicht angeben um alle Indizes, Regeln, Trigger oder Einschränkungen zu löschen, die für die Zieltabelle vorhanden sind. Diese werden automatisch gelöscht, auch wenn die Standardoption (RESTRICT
).
MySQL und MariaDB
Einige DBMS (wie MySQL und MariaDB) akzeptieren RESTRICT
und KASKADE
Schlüsselwörter, aber sie tun nichts. Sie werden lediglich zur leichteren Portabilität zwischen DBMSs bereitgestellt.
Orakel
Oracle hat eine etwas andere Syntax, CASCADE CONSTRAINTS
, wodurch alle referenziellen Integritätsbedingungen gelöscht werden, die sich auf Primärschlüssel und eindeutige Schlüssel in der gelöschten Tabelle beziehen.
SQL-Server
SQL Server unterstützt CASCADE
nicht oder EINSCHRÄNKT
Schlüsselwörter. Wenn die Tabelle Fremdschlüsselabhängigkeiten hat, müssen Sie diese löschen, bevor Sie die Tabelle löschen, andernfalls erhalten Sie eine Fehlermeldung.
In SQL Server können Sie jedoch eine Tabelle löschen, selbst wenn sie von einer Ansicht oder einer gespeicherten Prozedur referenziert wird. Daher sollten Sie nach solchen Verweisen suchen und sie explizit löschen, indem Sie DROP VIEW
verwenden oder DROP PROCEDURE
.
SQLite
SQLite unterstützt den CASCADE
nicht oder EINSCHRÄNKT
Schlüsselwörter.
Wenn die Zieltabelle von Ansichten referenziert wird, wird die Tabelle trotzdem gelöscht (und die Ansicht bleibt bestehen).
Wenn die Zieltabelle von Fremdschlüsseln referenziert wird, hängt das Ergebnis davon ab, ob Sie Fremdschlüssel aktiviert haben, und wenn ja, ob Daten in der untergeordneten Tabelle vorhanden sind, und wenn ja, ob der Fremdschlüssel mit
Wenn Sie SQLite verwenden, siehe SQLite DROP TABLE
für ein Beispiel und eine Diskussion zum Löschen einer Tabelle, auf die von einem Fremdschlüssel verwiesen wird.
Mehrere Tabellen löschen
Einige RDBMSs ermöglichen es Ihnen, mehrere Tabellen aus einer einzigen DROP TABLE
zu löschen Erklärung.
Beispiel:
DROP TABLE t11, t12;
Zu den RDBMS, die diese Syntax unterstützen, gehören SQL Server, MySQL, MariaDB und PostgreSQL.
Wenn Sie jedoch eine Tabelle löschen, auf die von einem Fremdschlüssel verwiesen wird, und dieser Fremdschlüssel verhindert, dass sie gelöscht wird, müssen Sie die untergeordnete Tabelle vor der übergeordneten Tabelle auflisten.
Wenn ich beispielsweise die obige Anweisung in SQL Server ausführe, erhalte ich die folgende Fehlermeldung:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
In diesem Fall kann ich einfach die Reihenfolge der Tabellen in meiner DROP TABLE
ändern Aussage:
DROP TABLE t12, t11;
Tatsächlich habe ich in diesem Fall einen weiteren Fehler erhalten, der mir mitteilt, dass t12
existiert nicht.
Hier ist, was ich habe:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Dies liegt daran, obwohl die vorherige Anweisung t11
nicht löschen konnte , war es tatsächlich erfolgreich beim Löschen von t12
.
Und genau wie eine Komödie der Fehler konnte es dieses Mal t11
fallen lassen aber nicht t12
.
Unabhängig davon wurden beide Tabellen jetzt gelöscht.
Aber wenn Sie die Bestellung beim ersten Mal richtig machen, sollten Sie eine Nachricht wie diese erhalten:
Commands completed successfully.
Das TEMPORARY-Schlüsselwort
Einige RDBMS (wie MySQL und MariaDB) akzeptieren einen TEMPORARY
Schlüsselwort.
Es geht zwischen DROP
und TABLE
, etwa so:
DROP TEMPORARY TABLE t1;
Mit dem TEMPORARY
Schlüsselwort stellt sicher, dass Sie nicht versehentlich eine nicht-temporäre Tabelle löschen, wenn Sie versuchen, eine temporäre Tabelle zu löschen.
Der TEMPORARY
Schlüsselwort hat die folgenden Auswirkungen:
- Die Anweisung löscht nur
TEMPORARY
Tabellen. - Die Anweisung verursacht kein implizites Commit (unter Verwendung von
DROP TABLE
ohne denTEMPORARY
Schlüsselwort schreibt automatisch die aktuelle aktive Transaktion fest). - Es werden keine Zugriffsrechte geprüft. Ein
TEMPORARY
Die Tabelle ist nur in der Sitzung sichtbar, in der sie erstellt wurde, daher ist keine Überprüfung erforderlich.
Die Löschklausel
Oracle hat ein optionales PURGE
-Klausel, die Sie verwenden können, wenn Sie die Tabelle löschen und den ihr zugeordneten Speicherplatz in einem einzigen Schritt freigeben möchten. Wenn Sie PURGE
angeben , platziert die Datenbank die Tabelle und ihre abhängigen Objekte nicht im Papierkorb.
Dies ist gleichbedeutend damit, die Tabelle zuerst zu löschen und sie dann aus dem Papierkorb zu löschen, aber Sie sparen einen Schritt in diesem Prozess.
Beachten Sie, dass, wenn Sie PURGE
angeben , können Sie die Tabelle nicht wiederherstellen.
Wenn Sie PURGE
nicht angeben , das DROP
TABELLE
-Anweisung führt nicht dazu, dass Speicherplatz für die Verwendung durch andere Objekte an den Tablespace zurückgegeben wird, und der Speicherplatz wird weiterhin auf das Speicherplatzkontingent des Benutzers angerechnet.