Zum Inhalt springen

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 integers
ADD 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 integers
ADD COLUMN l INTEGER DEFAULT 10;

Die Spalte k aus der Tabelle integers löschen:

ALTER TABLE integers
DROP k;

Den Typ der Spalte i mit einem Standard-Cast auf den Typ VARCHAR ändern:

ALTER TABLE integers
ALTER 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 integers
ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);

Den Standardwert einer Spalte setzen:

ALTER TABLE integers
ALTER COLUMN i SET DEFAULT 10;

Den Standardwert einer Spalte entfernen:

ALTER TABLE integers
ALTER COLUMN i DROP DEFAULT;

Eine Spalte auf nicht-nullable setzen:

ALTER TABLE integers
ALTER COLUMN i SET NOT NULL;

Den Not-NULL-Constraint entfernen:

ALTER TABLE integers
ALTER COLUMN i DROP NOT NULL;

Eine Tabelle umbenennen:

ALTER TABLE integers
RENAME TO integers_old;

Eine Spalte einer Tabelle umbenennen:

ALTER TABLE integers
RENAME i TO ii;

Einen Primärschlüssel zu einer Spalte einer Tabelle hinzufügen:

ALTER TABLE integers
ADD 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 integers
RENAME 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 integers
RENAME COLUMN i TO j;
ALTER TABLE integers
RENAME 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 integers
ADD COLUMN k INTEGER;

Oder:

ALTER TABLE integers
ADD k INTEGER;

Eine neue Spalte mit dem Namen l zur Tabelle integers hinzufügen; sie wird mit dem Standardwert 10 gefüllt:

ALTER TABLE integers
ADD 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 integers
DROP COLUMN k;

Oder:

ALTER TABLE integers
DROP 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:

Terminal window
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 integers
ALTER i TYPE VARCHAR;

Statt ALTER ⟨column_name⟩ TYPE ⟨type⟩{:.language-sql .highlight} können Sie auch die gleichwertigen Klauseln ALTER ⟨column_name⟩ SET TYPE ⟨type⟩{:.language-sql .highlight} und ALTER ⟨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 integers
ALTER 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 tbl
ALTER 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 integers
ALTER COLUMN i SET DEFAULT 10;

Den Standardwert einer Spalte entfernen:

ALTER TABLE integers
ALTER 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 integers
ADD PRIMARY KEY (i);

Einen Primärschlüssel zu mehreren Spalten einer Tabelle hinzufügen:

ALTER TABLE integers
ADD 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_table
SET ('option_name' = 'value');

Tabellenoptionen auf ihre Standardwerte zurücksetzen:

ALTER TABLE my_table
RESET ('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_table
SET ('option1' = 'value1', 'option2' = 'value2');
ALTER TABLE my_table
RESET ('option1', 'option2');

ADD / DROP CONSTRAINT

Die Klauseln ADD CONSTRAINT und DROP CONSTRAINT werden 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 tbl
VALUES ('asdf'), ('42');
DELETE FROM tbl
WHERE col = 'asdf';
ALTER TABLE tbl
ALTER COLUMN col TYPE INTEGER;
Terminal window
Conversion Error:
Could not convert string 'asdf' to INT32

Derzeit ist das erwartetes Verhalten. Als Workaround können Sie eine Kopie der Tabelle anlegen:

CREATE OR REPLACE TABLE tbl AS FROM tbl;