ALTER TABLE-Anweisung
Die ALTER TABLE-Anweisung ändert das Schema einer vorhandenen Tabelle im Katalog.
Beispiele
CREATE TABLE integers (i INTEGER, j INTEGER);Eine neue Spalte mit dem Namen k zur Tabelle integers hinzufügen; sie wird mit dem Standardwert NULL gefüllt:
ALTER TABLE integersADD COLUMN k INTEGER;Eine neue Spalte mit dem Namen l zur Tabelle integers hinzufügen; sie wird mit dem Standardwert 10 gefüllt:
ALTER TABLE integersADD COLUMN l INTEGER DEFAULT 10;Die Spalte k aus der Tabelle integers löschen:
ALTER TABLE integersDROP k;Den Typ der Spalte i mit einem Standard-Cast auf den Typ VARCHAR ändern:
ALTER TABLE integersALTER i TYPE VARCHAR;Den Typ der Spalte i auf den Typ VARCHAR ändern und den angegebenen Ausdruck verwenden, um die Daten für jede Zeile umzuwandeln:
ALTER TABLE integersALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);Den Standardwert einer Spalte setzen:
ALTER TABLE integersALTER COLUMN i SET DEFAULT 10;Den Standardwert einer Spalte entfernen:
ALTER TABLE integersALTER COLUMN i DROP DEFAULT;Eine Spalte auf nicht-nullable setzen:
ALTER TABLE integersALTER COLUMN i SET NOT NULL;Den Not-NULL-Constraint entfernen:
ALTER TABLE integersALTER COLUMN i DROP NOT NULL;Eine Tabelle umbenennen:
ALTER TABLE integersRENAME TO integers_old;Eine Spalte einer Tabelle umbenennen:
ALTER TABLE integersRENAME i TO ii;Einen Primärschlüssel zu einer Spalte einer Tabelle hinzufügen:
ALTER TABLE integersADD PRIMARY KEY (i);Syntax
ALTER TABLE ändert das Schema einer vorhandenen Tabelle.
Alle Änderungen durch ALTER TABLE respektieren vollständig die Transaktionssemantik, d. h. sie sind für andere Transaktionen erst nach dem Commit sichtbar und können durch ein Rollback vollständig rückgängig gemacht werden.
RENAME TABLE
Eine Tabelle umbenennen:
ALTER TABLE integersRENAME TO integers_old;Die Klausel RENAME TO benennt eine ganze Tabelle um und ändert ihren Namen im Schema. Beachten Sie, dass Sichten, die von der Tabelle abhängen, nicht automatisch aktualisiert werden.
RENAME COLUMN
Um eine Spalte einer Tabelle umzubenennen, verwenden Sie die Klauseln RENAME oder RENAME COLUMN:
ALTER TABLE integersRENAME COLUMN i TO j;ALTER TABLE integersRENAME i TO j;Die Klausel RENAME [COLUMN] benennt eine einzelne Spalte innerhalb einer Tabelle um. Constraints, die von diesem Namen abhängen (z. B. CHECK-Constraints), werden automatisch aktualisiert. Beachten Sie jedoch, dass Sichten, die von diesem Spaltennamen abhängen, nicht automatisch aktualisiert werden.
ADD COLUMN
Um eine Spalte einer Tabelle hinzuzufügen, verwenden Sie die Klauseln ADD oder ADD COLUMN.
Z. B. eine neue Spalte mit dem Namen k zur Tabelle integers hinzufügen; sie wird mit dem Standardwert NULL gefüllt:
ALTER TABLE integersADD COLUMN k INTEGER;Oder:
ALTER TABLE integersADD k INTEGER;Eine neue Spalte mit dem Namen l zur Tabelle integers hinzufügen; sie wird mit dem Standardwert 10 gefüllt:
ALTER TABLE integersADD COLUMN l INTEGER DEFAULT 10;Die Klausel ADD [COLUMN] kann verwendet werden, um einer Tabelle eine neue Spalte eines angegebenen Typs hinzuzufügen. Die neue Spalte wird mit dem angegebenen Standardwert gefüllt oder mit NULL, wenn keiner angegeben ist.
DROP COLUMN
Um eine Spalte einer Tabelle zu löschen, verwenden Sie die Klausel DROP oder DROP COLUMN:
Z. B. die Spalte k aus der Tabelle integers löschen:
ALTER TABLE integersDROP COLUMN k;Oder:
ALTER TABLE integersDROP k;Die Klausel DROP [COLUMN] kann verwendet werden, um eine Spalte aus einer Tabelle zu entfernen. Beachten Sie, dass Spalten nur entfernt werden können, wenn keine Indexes von ihnen abhängen. Dazu gehören Indexes, die als Teil eines PRIMARY KEY- oder UNIQUE-Constraints angelegt wurden. Spalten, die Teil von mehrspaltigen Check-Constraints sind, können ebenfalls nicht gelöscht werden.
Wenn Sie versuchen, eine Spalte mit einem Index zu löschen, gibt DuckDB die folgende Fehlermeldung zurück:
Dependency Error:Cannot alter entry "..." because there are entries that depend on it.[SET [DATA]] TYPE
Den Typ der Spalte i mit einem Standard-Cast auf den Typ VARCHAR ändern:
ALTER TABLE integersALTER i TYPE VARCHAR;Statt
ALTER ⟨column_name⟩ TYPE ⟨type⟩{:.language-sql .highlight} können Sie auch die gleichwertigen KlauselnALTER ⟨column_name⟩ SET TYPE ⟨type⟩{:.language-sql .highlight} undALTER ⟨column_name⟩ SET DATA TYPE ⟨type⟩{:.language-sql .highlight} verwenden.
Den Typ der Spalte i auf den Typ VARCHAR ändern und den angegebenen Ausdruck verwenden, um die Daten für jede Zeile umzuwandeln:
ALTER TABLE integersALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);Die Klausel [SET [DATA]] TYPE ändert den Typ einer Spalte in einer Tabelle. Vorhandene Daten in der Spalte werden gemäß dem in der USING-Klausel angegebenen Ausdruck umgewandelt oder, wenn die USING-Klausel fehlt, in den neuen Datentyp gecastet. Beachten Sie, dass der Typ von Spalten nur geändert werden kann, wenn keine Indexes von ihnen abhängen und sie nicht Teil von CHECK-Constraints sind.
Structs behandeln
Es gibt zwei Möglichkeiten, das Subschema einer STRUCT-typisierten Spalte zu ändern.
ALTER TABLE mit struct_insert
Sie können ALTER TABLE mit der Funktion struct_insert verwenden.
Zum Beispiel:
CREATE TABLE tbl (col STRUCT(i INTEGER));ALTER TABLE tblALTER col TYPE USING struct_insert(col, a := 42, b := NULL::VARCHAR);ALTER TABLE mit ADD COLUMN / DROP COLUMN / RENAME COLUMN
Ab DuckDB v1.3.0 unterstützt ALTER TABLE die
Klauseln ADD COLUMN, DROP COLUMN und RENAME COLUMN,
um das Subschema eines STRUCT zu aktualisieren.
SET / DROP DEFAULT
Den Standardwert einer Spalte setzen:
ALTER TABLE integersALTER COLUMN i SET DEFAULT 10;Den Standardwert einer Spalte entfernen:
ALTER TABLE integersALTER COLUMN i DROP DEFAULT;Die Klausel SET/DROP DEFAULT ändert den DEFAULT-Wert einer vorhandenen Spalte. Beachten Sie, dass vorhandene Daten in der Spalte dadurch nicht geändert werden. Das Entfernen des Defaults entspricht dem Setzen des Standardwerts auf NULL.
Warnung Derzeit erlaubt DuckDB das Ändern einer Tabelle nicht, wenn Abhängigkeiten bestehen. Das bedeutet: Wenn Sie einen Index auf einer Spalte haben, müssen Sie zuerst den Index löschen, die Tabelle ändern und den Index anschließend neu anlegen. Andernfalls erhalten Sie einen
Dependency Error.
ADD PRIMARY KEY
Einen Primärschlüssel zu einer Spalte einer Tabelle hinzufügen:
ALTER TABLE integersADD PRIMARY KEY (i);Einen Primärschlüssel zu mehreren Spalten einer Tabelle hinzufügen:
ALTER TABLE integersADD PRIMARY KEY (i, j);SET / RESET (Tabellenoptionen)
Dieses Feature wurde in DuckDB v1.5 eingeführt.
Tabellenoptionen nach dem Anlegen der Tabelle ändern.
Tabellenoptionen setzen:
ALTER TABLE my_tableSET ('option_name' = 'value');Tabellenoptionen auf ihre Standardwerte zurücksetzen:
ALTER TABLE my_tableRESET ('option_name');Die SET-Klausel weist Tabellenoptionen Werte als Schlüssel-Wert-Paare zu. Die RESET-Klausel entfernt Optionen oder setzt sie auf ihre Standardwerte zurück, abhängig von der Katalogimplementierung.
Mehrere Optionen können in einer einzigen Anweisung gesetzt oder zurückgesetzt werden:
ALTER TABLE my_tableSET ('option1' = 'value1', 'option2' = 'value2');
ALTER TABLE my_tableRESET ('option1', 'option2');ADD / DROP CONSTRAINT
Die Klauseln
ADD CONSTRAINTundDROP CONSTRAINTwerden in DuckDB noch nicht unterstützt.
Einschränkungen
ALTER COLUMN schlägt fehl, wenn Werte widersprüchlicher Typen irgendwann in der Tabelle aufgetreten sind, auch wenn sie gelöscht wurden:
CREATE TABLE tbl (col VARCHAR);
INSERT INTO tblVALUES ('asdf'), ('42');
DELETE FROM tblWHERE col = 'asdf';
ALTER TABLE tblALTER COLUMN col TYPE INTEGER;Conversion Error:Could not convert string 'asdf' to INT32Derzeit ist das erwartetes Verhalten. Als Workaround können Sie eine Kopie der Tabelle anlegen:
CREATE OR REPLACE TABLE tbl AS FROM tbl;