Database
 sql >> Datenbank >  >> RDS >> Database

SQL DROP COLUMN für Anfänger

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 , oder PRIMARY 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