ALTER TABLE … ALTER COLUMN¶
Unter diesem Thema wird beschrieben, wie Sie die Spalteneigenschaften einer Tabelle mit der ALTER COLUMN
-Klausel in einer ALTER TABLE-Anweisung ändern können.
Die folgende Tabelle beschreibt die unterstützten/nicht unterstützten Aktionen beim Ändern von Spalteneigenschaften:
Aktion |
Unterstützt |
Nicht unterstützt |
Anmerkungen |
---|---|---|---|
Standardwerte |
|||
Löschen des Standards einer Spalte (d. h.
DROP DEFAULT ). |
✔ |
Nicht zulässig, wenn Spalte und Standardwert durch einen ALTER TABLE-Befehl definiert wurden. Weitere Details dazu finden Sie in den Nutzungshinweisen unten. |
|
Ändern der Standardsequenz einer Spalte (d. h.
SET DEFAULT seq_name.NEXTVAL ). |
✔ |
Nur für Spalten verwenden, die bereits eine Sequenz haben. |
|
Ändern des Standards einer Spalte, wenn der Standard keine Sequenz ist.
|
✔ |
||
Hinzufügen eines Standards für eine Spalte
|
✔ |
||
NULL-Zulässigkeit |
|||
Ändern der NULL-Zulässigkeit einer Spalte (z. B.
SET NOT NULL oder DROP NOT NULL ) |
✔ |
||
Datentypen |
|||
✔ |
|||
✔ |
|||
✔ |
|||
✔ |
|||
✔ |
|||
✔ |
Nur zulässig, wenn die neue Genauigkeit ausreicht, um alle aktuell in der Spalte vorhandenen Werte zu speichern. Darüber hinaus kann sich eine Verringerung der Genauigkeit auf Time Travel auswirken (weitere Informationen dazu finden Sie unter Nutzungshinweise). |
||
✔ |
|||
Kommentare |
|||
Festlegen oder Löschen des Kommentars für eine Spalte.
|
✔ |
||
Maskierungsrichtlinie |
|||
Festlegen oder Aufheben einer Maskierungsrichtlinie für eine Spalte.
|
✔ |
||
Projektionsrichtlinie |
|||
Festlegen oder Aufheben einer Projektionsrichtlinie für eine Spalte.
|
✔ |
||
Objekt-Tagging |
|||
Tag einer Spalte zuordnen oder entziehen
|
✔ |
Eine Spalte kann bis zu 20 Tags unterstützen, und die maximale Anzahl von Zeichen für einen Tag-Zeichenfolgenwert ist 256. |
- Siehe auch:
ALTER TABLE, CREATE TABLE, DROP TABLE, SHOW TABLES, DESCRIBE TABLE
Syntax¶
ALTER TABLE <name> { ALTER | MODIFY } [ ( ]
[ COLUMN ] <col1_name> DROP DEFAULT
, [ COLUMN ] <col1_name> SET DEFAULT <seq_name>.NEXTVAL
, [ COLUMN ] <col1_name> { [ SET ] NOT NULL | DROP NOT NULL }
, [ COLUMN ] <col1_name> [ [ SET DATA ] TYPE ] <type>
, [ COLUMN ] <col1_name> COMMENT '<string>'
, [ COLUMN ] <col1_name> UNSET COMMENT
[ , [ COLUMN ] <col2_name> ... ]
[ , ... ]
[ ) ]
ALTER TABLE <name> { ALTER | MODIFY } [ COLUMN ] dataGovnPolicyTagAction
Nutzungshinweise¶
Eine einzelne ALTER TABLE-Anweisung kann verwendet werden, um mehrere Spalten in einer Tabelle zu ändern. Jede Änderung wird als Klausel angegeben, die aus der zu ändernden Spalte und der Spalteneigenschaft besteht, getrennt durch Kommas:
Verwenden Sie entweder das Schlüsselwort
ALTER
oderMODIFY
, um die Liste der Klauseln (d. h. der zu ändernden Spalten/Eigenschaften) zu starten.Klammern können für die Gruppierung der Klauseln verwendet werden, sind aber nicht erforderlich.
Das Schlüsselwort
COLUMN
kann in jeder Klausel angegeben werden, ist aber nicht erforderlich.Die Klauseln können in beliebiger Reihenfolge angegeben werden.
Wenn für eine Spalte
NOT NULL
festgelegt wird und die Spalte NULL-Werte enthält, wird ein Fehler zurückgegeben und es werden keine Änderungen an der Spalte vorgenommen.Spalten, die semistrukturierte Daten verwenden (ARRAY, OBJECT und VARIANT), können nicht auf
NOT NULL
gesetzt werden, außer wenn die Tabelle leer ist. Das Setzen dieser Spalten aufNOT NULL
, wenn die Tabelle Zeilen enthält, wird nicht unterstützt und führt zu einem Fehler.Um die Standardsequenz für eine Spalte zu ändern, muss die Spalte bereits eine Standardsequenz haben. Sie können mit dem Befehl
ALTER TABLE ... SET DEFAULT < Sequenzname>
nur dann eine Sequenz zu einer Spalte hinzufügen, wenn die Spalte bereits eine Sequenz hat.Wenn Sie eine Tabelle ändern, um eine Spalte mit einem
DEFAULT
-Wert hinzuzufügen, können Sie den Standardwert für diese Spalte nicht löschen. In der folgenden Anweisungsfolge führt beispielsweise die letzte AnweisungALTER TABLE ... ALTER COLUMN
zu einem Fehler:CREATE TABLE t(x INT); INSERT INTO t VALUES (1), (2), (3); ALTER TABLE t ADD COLUMN y INT DEFAULT 100; INSERT INTO t(x) VALUES (4), (5), (6); ALTER TABLE t ALTER COLUMN y DROP DEFAULT;
Diese Einschränkung verhindert Inkonsistenzen zwischen Werten in Zeilen, die vor dem Hinzufügen der Spalte eingefügt wurden, und Werten in Zeilen, die nach dem Hinzufügen der Spalte eingefügt wurden. Wenn der Standardwert wegfallen würde, würde die Spalte Folgendes enthalten:
NULL-Wert für Zeilen, die vor dem Hinzufügen der Spalte eingefügt wurden.
Standardwert für Zeilen, die nach dem Hinzufügen der Spalte eingefügt wurden.
Das Löschen des Standardspaltenwerts aus einem beliebigen Klon der Tabelle ist ebenfalls nicht zulässig.
Wenn Sie
TYPE
für eine Spalte festlegen, muss der angegebene Typ (d. h.type
) entweder NUMBER oder ein Text-Datentyp (VARCHAR, STRING, TEXT usw.) sein.Für den Datentyp NUMBER kann
TYPE
verwendet werden, um Folgendes zu erreichen:Erhöhung der Genauigkeit der angegebenen Zahlenspalte
Verringerung der Genauigkeit der angegebenen Zahlenspalte, wenn die neue Genauigkeit ausreicht, um alle aktuell in der Spalte enthaltenen Datenwerte zu speichern
Bei Textdatentypen kann
TYPE
nur verwendet werden, um die Länge der Spalte zu erhöhen.
Wenn die Genauigkeit einer Spalte unter die maximale Genauigkeit aller in Time Travel gespeicherten Spaltendaten verringert wird, können Sie die Tabelle erst wiederherstellen, wenn Sie die Genauigkeit wieder erhöht haben.
Bei Maskierungsrichtlinien:
Die
USING
-Klausel und das SchlüsselwortFORCE
sind beide optional, d. h. beide sind nicht erforderlich, um eine Maskierungsrichtlinie für eine Spalte festzulegen. DieUSING
-Klausel und das SchlüsselwortFORCE
können einzeln oder zusammen verwendet werden. Weitere Details dazu finden Sie unter:Eine einzelne Maskierungsrichtlinie, die bedingte Spalten verwendet, kann auf mehrere Tabellen angewendet werden, sofern die Spaltenstruktur der Tabelle mit den in der Richtlinie angegebenen Spalten übereinstimmt.
Wenn Sie eine oder mehrere Tabellenspalten mit Maskierungsrichtlinie oder die Tabelle selbst mit Zeilenzugriffsrichtlinie ändern, können Sie mit der Funktion POLICY_CONTEXT eine Abfrage auf den mit einer Maskierungsrichtlinie geschützten Spalten bzw. auf der mit einer Zeilenzugriffsrichtlinie geschützten Tabelle simulieren.
Hinweis zu Metadaten (z. B. das Feld
COMMENT
):Achtung
Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.
Beispiele¶
Beispiel-Setup:
CREATE OR REPLACE TABLE t1 ( c1 NUMBER NOT NULL, c2 NUMBER DEFAULT 3, c3 NUMBER DEFAULT seq1.nextval, c4 VARCHAR(20) DEFAULT 'abcde', c5 STRING); DESC TABLE t1; +------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+ | name | type | kind | null? | default | primary key | unique key | check | expression | comment | |------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------| | C1 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL | | C2 | NUMBER(38,0) | COLUMN | Y | 3 | N | N | NULL | NULL | NULL | | C3 | NUMBER(38,0) | COLUMN | Y | DB1.PUBLIC.SEQ1.NEXTVAL | N | N | NULL | NULL | NULL | | C4 | VARCHAR(20) | COLUMN | Y | 'abcde' | N | N | NULL | NULL | NULL | | C5 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | +------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
Nehmen Sie folgende Änderungen an t1
vor:
Ändern Sie die NOT NULL-Spalte
c1
in NULL.Löschen Sie die Standardeinstellung für Spalte
c2
, und ändern Sie die Standardsequenz für Spaltec3
.Vergrößern Sie die Länge der Spalte
c4
, und entfernen Sie die Standardeinstellung für die Spalte.Fügen Sie einen Kommentar für Spalte
c5
hinzu.ALTER TABLE t1 ALTER COLUMN c1 DROP NOT NULL; ALTER TABLE t1 MODIFY c2 DROP DEFAULT, c3 SET DEFAULT seq5.nextval ; ALTER TABLE t1 ALTER c4 SET DATA TYPE VARCHAR(50), COLUMN c4 DROP DEFAULT; ALTER TABLE t1 ALTER c5 COMMENT '50 character column'; DESC TABLE t1; +------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+ | name | type | kind | null? | default | primary key | unique key | check | expression | comment | |------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------| | C1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | | C2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | | C3 | NUMBER(38,0) | COLUMN | Y | DB1.PUBLIC.SEQ5.NEXTVAL | N | N | NULL | NULL | NULL | | C4 | VARCHAR(50) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | | C5 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | 50 character column | +------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
Um die Vielseitigkeit/Flexibilität des Befehls zu veranschaulichen, wird das vorherige Beispiel mit folgenden Änderungen verwendet:
Alle Aktionen werden mit einer einzigen
ALTER COLUMN
-Klausel ausgeführt.Die Reihenfolge der Spalten in der Klausel ist verändert.
SET DATA TYPE
ist auf ein einfachesTYPE
verkürzt.ALTER TABLE t1 ALTER ( c1 DROP NOT NULL, c5 COMMENT '50 character column', c4 TYPE VARCHAR(50), c2 DROP DEFAULT, COLUMN c4 DROP DEFAULT, COLUMN c3 SET DEFAULT seq5.nextval );Dieses Beispiel liefert die gleichen Ergebnisse.
Anwenden einer Maskierungsrichtlinie für Sicherheit auf Spaltenebene auf eine Tabellenspalte:
-- single column ALTER TABLE empl_info MODIFY COLUMN empl_id SET MASKING POLICY mask_empl_id; -- multiple columns ALTER TABLE empl_info MODIFY COLUMN empl_id SET MASKING POLICY mask_empl_id , COLUMN empl_dob SET MASKING POLICY mask_empl_dob ;
Deaktivieren der auf eine Tabellenspalte angewendeten Maskierungsrichtlinie für Sicherheit auf Spaltenebene:
-- single column ALTER TABLE empl_info modify column empl_id unset masking policy; -- multiple columns ALTER TABLE empl_info MODIFY COLUMN empl_id UNSET MASKING POLICY , COLUMN empl_dob UNSET MASKING POLICY ;