Kategorien:

DDL für Tabellen, Ansichten und Sequenzen

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).

Ändern der Standardsequenz einer Spalte (d. h. SET DEFAULT Sequenzname.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

Ändern des Datentyps einer Spalte in einen synonymen Typ (z. B. STRING in VARCHAR).

Ändern des Datentyps einer Spalte in einen anderen Typ (z. B. STRING in NUMBER).

Erhöhen der Länge einer Text-/Zeichenfolgenspalte (z. B. VARCHAR(50) auf VARCHAR(100)).

Verringern der Länge einer Text-/Zeichenfolgenspalte (z. B. VARCHAR(50) auf VARCHAR(25)).

Erhöhen der Genauigkeit einer Zahlenspalte (z. B. NUMBER(10,2) auf NUMBER(20,2)).

Verringern der Genauigkeit einer Zahlenspalte (z. B. NUMBER(20,2) auf NUMBER(10,2)).

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).

Ändern der Skalierung einer Zahlenspalte (z. B. NUMBER(10,2) in NUMBER(10,4)).

Kommentare

Kommentar zu einer Spalte hinzufügen oder überschreiben.

Maskierungsrichtlinie

Festlegen oder Deaktivieren einer Sicherheit auf Spaltenebene-Maskierungsrichtlinie für eine Spalte.

Nur eine Spalte pro ALTER-Anweisung. Führen Sie eine einzelne ALTER-Anweisung für eine Spalte aus, um eine Maskierungsrichtlinie für Sicherheit auf Spaltenebene festzulegen oder zu deaktivieren.

Unter diesem Thema:

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> SET MASKING POLICY <policy_name>
                                          [ , [ COLUMN ] <col2_name> ... ]
                                          [ , ... ]
                                      [ ) ]

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 oder MODIFY, 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.

  • 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 TYPE für eine Spalte festlegen, muss der angegebene Typ (d. h. Typ) ein 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 Textspalte

      • Verringerung der Genauigkeit der angegebenen Textspalte, 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 nicht wiederherstellen, ohne zuvor die Genauigkeit zu erhöhen.

  • Nur eine Spalte pro ALTER-Anweisung. Führen Sie eine einzelne ALTER-Anweisung für eine Spalte aus, um eine Maskierungsrichtlinie für Sicherheit auf Spaltenebene festzulegen oder zu deaktivieren.

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 Spalte c3.

  • 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 einfaches TYPE 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:

ALTER TABLE empl_info MODIFY COLUMN empl_id SET MASKING POLICY mask_empl_id;

Deaktivieren der auf eine Tabellenspalte angewendeten Maskierungsrichtlinie für Sicherheit auf Spaltenebene:

ALTER TABLE empl_info modify column empl_id unset masking policy;