カテゴリ:

テーブル、ビュー、シーケンス DDL

ALTER TABLE ... ALTER COLUMN

このトピックでは、 ALTER TABLE ステートメントで ALTER COLUMN 句を使用して、テーブルの1つ以上の列プロパティを変更する方法について説明します。

こちらもご参照ください。

ALTER TABLECREATE TABLEDROP TABLESHOW TABLESDESCRIBE TABLE

次のテーブルは、列のプロパティを変更するためのサポート対象/サポート対象外のアクションを示しています。

アクション

サポート対象

サポート対象外

注意

デフォルト値

列のデフォルト(つまり DROP DEFAULT )をドロップします。

列とデフォルトが ALTER TABLE コマンドで定義されているときは許可されません。詳細については、以下の 使用上の注意 をご参照ください。

列のデフォルトシーケンスを変更します(つまり、 SET DEFAULT シーケンス名.NEXTVAL)。

すでにシーケンスが含まれている列にのみ使用します。

デフォルトがシーケンスでない限り、列のデフォルトを変更します。

列のデフォルトを追加します。

NULL値の許容度

列のNULL値の許容度を変更します(つまり、 SET NOT NULL または DROP NOT NULL)。

データ型

列の データ型 を同義の型に変更します(例: STRING から VARCHAR)。

列の データ型 を同義の型に変更します(例: STRING から NUMBER)。

テキスト/文字列の列 の長さを増やします(例: VARCHAR(50) から VARCHAR(100))。

テキスト/文字列の列 の長さを短くします(例: VARCHAR(50) から VARCHAR(25))。

数値列 の精度を上げます(例: NUMBER(10,2) から NUMBER(20,2))。

数値列 の精度を下げます(例: NUMBER(20,2) から NUMBER(10,2))。

新しい精度が、現在列にある すべて の値を保持するのに十分な場合にのみ許可されます。さらに、精度を下げると、Time Travelに影響する可能性があります(詳細については、 使用上の注意 をご参照ください)。

数値列 のスケールを変更します(例: NUMBER(10,2) から NUMBER(10,4))。

コメント

列のコメントを設定または設定解除します。

マスキングポリシー

列の 列レベルのセキュリティ マスキングポリシーを設定または設定解除します。

オブジェクトのタグ付け

列の タグ の設定または設定解除。

列は最大20タグをサポートでき、タグ文字列値の最大文字数は256です。

構文

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 <col1_name> SET MASKING POLICY <policy_name> [ USING ( <col1_name> , cond_col_1 , ... ) ]

ALTER TABLE <name> { ALTER | MODIFY } COLUMN <col1_name> UNSET MASKING POLICY

ALTER TABLE <name> { ALTER | MODIFY }
                                       [ COLUMN ] <col1_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
                                     , [ COLUMN ] <col2_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
                                     ...

ALTER TABLE <name> { ALTER | MODIFY }
                                       COLUMN <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                                     , COLUMN <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                                     ...

使用上の注意

  • 単一の ALTER TABLE ステートメントを使用して、テーブル内の複数の列を変更できます。各変更は、変更する列と列のプロパティで構成される句として指定され、コンマで区切られます。

    • ALTER または MODIFY キーワードを使用して、ステートメントの句のリスト(変更する列/プロパティ)を開始します。

    • 括弧は句のグループ化に使用できますが、必須ではありません。

    • COLUMN キーワードは各句で指定できますが、必須ではありません。

    • 句は任意の順序で指定できます。

  • 列を NOT NULL に設定するときに、列に NULL 値が含まれる場合、エラーが返され、列に変更は適用されません。

  • 列のデフォルトの順序を変更するには、列にデフォルトの順序が存在している必要があります。まだシーケンスを持たない列にシーケンスを追加するために、コマンド ALTER TABLE ... SET DEFAULT <シーケンス名> を使用することはできません。

  • DEFAULT 値の列を追加するようにテーブルを変更した場合は、その列のデフォルト値をドロップすることはできません。たとえば、次の一連のステートメントでは、最後の ALTER TABLE ... ALTER COLUMN ステートメントによってエラーが発生します。

    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;
    

    この制限により、列が追加される前に挿入された行と、列が追加された後に挿入された行の値の不一致が防止されます。デフォルトが削除された場合、列には次が含まれます。

    • 列が追加される前に挿入された行のNULL 値。

    • 列が追加された後に挿入された行のデフォルト値。

    テーブルのクローンからデフォルトの列値を削除することも禁止されています。

  • 列に TYPE を設定する場合、指定する型(つまり タイプ)は NUMBER または テキストデータ型 (VARCHAR、STRING、TEXTなど)である必要があります。

    • NUMBERデータ型の場合、 TYPE を使用して次のことができます。

      • 指定した数値列の精度を上げる。

      • 新しい精度が現在列にあるすべてのデータ値を保持するのに十分である場合は、指定された数値列の精度を下げる。

    • テキストデータ型の場合、 TYPE は列の長さを 増やす ためにのみ使用できます。

  • 列の精度がTime Travelに保持されている列データの最大精度を下回った場合は、最初に精度を上げることなくテーブルを復元することはできません。

  • テーブルの列構造がポリシーで指定された列と一致する場合は、条件付き列を使用する単一のマスキングポリシーを複数のテーブルに適用できます。

  • マスキングポリシーを使用して1つ以上のテーブル列を変更する場合は、 POLICY_CONTEXT 関数を使用して、マスキングポリシーで保護されている列に対するクエリをシミュレートします。

  • メタデータ(たとえば、 COMMENT フィールド)に関して、

    注意

    Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。

設定例:

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    |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+

t1 に次の変更を加えます。

  • NOTNULL 列 c1 を NULL に変更します。

  • c2 のデフォルトをドロップし、列 c3 のデフォルトシーケンスを変更します。

  • c4 の長さを増やし、列のデフォルトをドロップします。

  • c5 にコメントを追加します。

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 |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+

前の例と同じですが、次の変更によりコマンドの汎用性/柔軟性を示しています。

  • 単一の ALTER COLUMN 句で実行されるすべてのアクション。

  • 句内の列の順序は異なります。

  • SET DATA TYPETYPE を単純化するために短縮されました。

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

この例では、同じ結果が生成されます。

列レベルのセキュリティマスキングポリシーをテーブル列に適用します。

-- 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
;

テーブル列から列レベルのセキュリティマスキングポリシーを設定解除します。

-- 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
;