Wenn Sie in SQL eine Spalte aus einer Tabelle entfernen möchten, müssen Sie ALTER TABLE
verwenden -Anweisung mit dem DROP COLUMN
Klausel.
Dadurch werden die Spalte und alle ihre Daten entfernt.
Syntax
Die Syntax lautet wie folgt:
ALTER TABLE table_name
DROP COLUMN column_name;
Einige RDBMSs akzeptieren einen optionalen IF EXISTS
-Argument, was bedeutet, dass kein Fehler zurückgegeben wird, wenn die Spalte nicht vorhanden ist.
Einige RDBMSs akzeptieren auch optional CASCADE
und RESTRICT
Argumente, die angeben, was zu tun ist, wenn die Spalte Abhängigkeiten aufweist. Siehe unten für mehr dazu.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Dadurch wird die ProductDescription
entfernt Spalte aus den Products
Tabelle.
Der IF EXISTS
Argument
Abhängig von Ihrem RDBMS können Sie möglicherweise den IF EXISTS
verwenden -Argument, das die Spalte nur bedingt löscht, wenn sie bereits vorhanden ist.
Der Vorteil dabei ist, dass Sie keine Fehlermeldung erhalten, wenn die Spalte nicht vorhanden ist.
Beispiel:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Beschränken Sie die Änderung
Abhängig von Ihrem RDBMS können Sie möglicherweise CASCADE
verwenden und RESTRICT
Argumente, um anzugeben, was zu tun ist, wenn die Spalte Abhängigkeiten hat, wie z. B. Fremdschlüssel oder Ansichten.
RESTRICT
ist normalerweise das Standardverhalten. Wenn Sie also keines dieser Argumente angeben, weigert sich das DBMS, die Spalte zu löschen, wenn abhängige Objekte vorhanden sind.
Beispiel:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Wenn Sie die obige Anweisung verwenden und die Spalte Abhängigkeiten aufweist, schlägt der Löschvorgang fehl, und Sie erhalten eine Fehlermeldung.
Hier ist der Fehler, den ich in PostgreSQL bekomme, wenn ich versuche, eine Tabelle zu löschen, die von einer Ansicht referenziert wird:
cannot drop column productdescription of table products because other objects depend on it
Kaskadieren Sie den Wandel
Mit CASCADE
Option bewirkt, dass alle abhängigen Objekte gelöscht werden.
Folgendes passiert, wenn ich das vorherige Beispiel in CASCADE
ändere :
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Ergebnis:
NOTICE: drop cascades to view vproducts Commands completed successfully
In diesem Fall wurde die Spalte gelöscht und ich erhielt eine Meldung, die erklärte, dass die Ansicht vproducts
genannt wurde wurde ebenfalls gelöscht.
CASCADE
und RESTRICT
werden in PostgreSQL unterstützt, aber nicht in SQL Server oder MySQL. Beide Schlüsselwörter können in MariaDB verwendet werden, haben aber keine Auswirkung.
Oracle akzeptiert CASCADE CONSTRAINTS
-Klausel, die alle Fremdschlüsseleinschränkungen löscht, die sich auf die Primärschlüssel und eindeutigen Schlüssel beziehen, die in den gelöschten Spalten definiert sind, sowie alle Mehrspalteneinschränkungen, die in den gelöschten Spalten definiert sind.
Mehrere Spalten löschen
Bei einigen RDBMs können Sie mehrere Spalten innerhalb einer einzigen ALTER TABLE
löschen Erklärung. Die Syntax variiert zwischen RDBMS.
In SQL Server können Sie einfach jede Spalte durch ein Komma getrennt auflisten:
ALTER TABLE t1
DROP COLUMN c1, c2;
In anderen RDBMS (wie MySQL und PostgreSQL) müssten Sie DROP COLUMN
umschreiben für jede Spalte:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Beachten Sie, dass diese Syntax eine Erweiterung von SQL ist und nicht dem SQL-Standard entspricht, nur einen DROP
zu haben Klausel per ALTER TABLE
Erklärung.
Lassen Sie die letzte Spalte fallen
Bei einigen RDBMs können Sie die letzte Spalte in der Tabelle löschen, sodass eine leere Tabelle ohne Spalten bleibt. Dies ist eine Erweiterung des SQL-Standards (der keine Nullspaltentabellen zulässt).
In PostgreSQL habe ich beispielsweise die folgende Anweisung verwendet, um die letzte verbleibende Spalte in der Tabelle zu löschen
ALTER TABLE t1
DROP COLUMN c3;
Ergebnis:
Commands completed successfully
Aber in SQL Server, wenn ich dasselbe mache:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Ergebnis:
Msg 4923, Level 16, State 1, Line 1 ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.
Beachten Sie, dass trotz des Wortlauts dieser Fehlermeldung c3 nicht die einzige verbleibende Spalte war. Es waren eigentlich drei Säulen. c3 wäre jedoch das letzte verbleibende gewesen, wenn die anderen beiden weggefallen wären. In diesem Fall wurde keine der drei Spalten tatsächlich gelöscht.
Wie auch immer, selbst wenn ich die anderen beiden löschen würde, weigerte sich SQL Server, das letzte zu löschen.
MySQL weigert sich auch, die letzte Spalte in einer Tabelle zu löschen.
Wenn Sie die Tabelle löschen möchten, verwenden Sie DROP TABLE
.
Einschränkungen durch RDBMS
Obwohl die grundlegende DROP COLUMN
Die Syntax ist bei den meisten großen RDBMSs ziemlich ähnlich, jedes RDBMS hat in der Regel seine eigenen Einschränkungen, wann eine Spalte gelöscht wird oder nicht.
Hier sind einige der Einschränkungen einiger der wichtigsten RDBMSs.
SQL-Server
Eine Spalte kann nicht gelöscht werden, wenn sie:
ist- Wird in einem Index verwendet, sei es als Schlüsselspalte oder als
INCLUDE
- Verwendet in einem
CHECK
,FOREIGN KEY
,UNIQUE
, oderPRIMARY KEY
Einschränkung. - Verknüpft mit einem Standard, der mit
DEFAULT
definiert ist Schlüsselwort oder an ein Standardobjekt gebunden. - An eine Regel gebunden.
Quelle für SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Wenn Spalten aus einer Tabelle gelöscht werden, werden die Spalten auch aus jedem Index entfernt, zu dem sie gehören. Wenn alle Spalten, die einen Index bilden, gelöscht werden, wird der Index ebenfalls gelöscht.
Quelle für MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Indizes und Tabelleneinschränkungen, die die Spalte betreffen, werden ebenfalls automatisch gelöscht.
Multivariate Statistiken, die auf die gelöschte Spalte verweisen, werden ebenfalls entfernt, wenn das Entfernen der Spalte dazu führen würde, dass die Statistiken Daten für nur eine einzige Spalte enthalten würden.
Sie müssen CASCADE
verwenden wenn irgendetwas außerhalb der Tabelle von der Spalte abhängt, zum Beispiel Fremdschlüssel oder Views.
Quelle für PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite unterstützt die DROP COLUMN
nicht Syntax. Sie können eine Spalte in SQLite nicht löschen.
Wenn Sie eine Spalte in SQLite löschen müssen, wird empfohlen, dass Sie dem in der SQLite-Dokumentation empfohlenen 12-Schritte-Prozess folgen.
Quelle für SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Wenn die Spalte Teil eines beliebigen Indexes ist, wird die Spalte aus diesen gelöscht, es sei denn, Sie fügen gleichzeitig eine neue Spalte mit identischem Namen hinzu. Der Index wird gelöscht, wenn alle Spalten aus dem Index gelöscht wurden. Wenn die Spalte in einer Ansicht oder einem Trigger verwendet wurde, erhalten Sie beim nächsten Zugriff auf die Ansicht oder den Trigger eine Fehlermeldung.
Ab MariaDB 10.2.8, Löschen einer Spalte, die Teil eines mehrspaltigen UNIQUE
ist Einschränkung ist nicht zulässig.
MariaDB akzeptiert RESTRICT
und CASCADE
um die Portierung von anderen Datenbanksystemen zu erleichtern, aber in MariaDB tun sie nichts.
MariaDB 10.4.0 unterstützt sofortiges DROP COLUMN
. DROP COLUMN
einer indizierten Spalte würde DROP INDEX
implizieren (und im Fall eines Nicht-UNIQUE
mehrspaltiger Index, evtl. ADD INDEX
). Diese sind mit ALGORITHM=INSTANT
nicht erlaubt , aber im Gegensatz zu früher können sie mit ALGORITHM=NOCOPY
zugelassen werden .
Quelle für MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column