ALTER TABLE ... ALTER COLUMN

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

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

アクション

サポート対象

サポート対象外

注意

デフォルト値

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

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

列のデフォルトシーケンスを変更します(つまり、 SET DEFAULT seq_name.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 TABLECREATE TABLEDROP TABLESHOW TABLESDESCRIBE TABLE

構文

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 , ... ) ]
                                                                                          [ FORCE ]

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> ... ]
                                     ...
Copy

使用上の注意

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

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

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

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

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

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

  • 半構造化データ型(ARRAY、 OBJECT、 VARIANT)を使用する列は、テーブルが空の場合を除き、 NOT NULL に設定することはできません。テーブルに行が含まれているときにこれらの列を NOT 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;
    
    Copy

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

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

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

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

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

    • NUMBER データ型の場合は、 TYPE を使用して次を実行できます。

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

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

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

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

  • マスキングポリシーの場合、

    • USING 句と FORCE キーワードはどちらもオプションです。どちらも、列にマスキングポリシーを設定する必要はありません。 USING 句と FORCE キーワードは、個別にまたは一緒に使用できます。詳細については、以下をご参照ください。

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

    • マスキングポリシーを使用して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    |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
Copy

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

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

  • 単一の 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
  );
Copy

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

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

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

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

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