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 )。 |
✔ |
||
データ型 |
|||
✔ |
|||
✔ |
|||
✔ |
|||
✔ |
|||
✔ |
|||
✔ |
新しい精度が、現在列にある すべて の値を保持するのに十分な場合にのみ許可されます。さらに、精度を下げると、Time Travelに影響する可能性があります(詳細については、 使用上の注意 をご参照ください)。 |
||
✔ |
|||
コメント |
|||
列のコメントを設定または設定解除します。
|
✔ |
||
マスキングポリシー |
|||
列の マスキングポリシー を設定または設定解除します。
|
✔ |
||
投影ポリシー |
|||
列の 投影ポリシー を設定または設定解除します。
|
✔ |
||
オブジェクトのタグ付け |
|||
列の タグ の設定または設定解除。
|
✔ |
列は最大20タグをサポートでき、タグ文字列値の最大文字数は256です。 |
- こちらもご参照ください。
ALTER TABLE、 CREATE TABLE、 DROP TABLE、 SHOW TABLES、 DESCRIBE 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 ] dataGovnPolicyTagAction
使用上の注意¶
単一の 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;
この制限により、列が追加される前に挿入された行と、列が追加された後に挿入された行の値の不一致が防止されます。デフォルトが削除された場合、列には次が含まれます。
列が追加される前に挿入された行の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 | +------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
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 TYPE
はTYPE
を単純化するために短縮されました。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 ;