ALTER TABLE
説明
既存のテーブルを変更します。以下を含みます:
- テーブル、パーティション、インデックスの名前変更
- テーブルコメントの変更
- アトミックスワップ
- パーティションの追加/削除とパーティション属性の変更
- スキーマ変更
- ロールアップインデックスの作成/削除
- ビットマップインデックスの変更
- 手動データバージョンのコンパクション
この操作には、対象テーブルに対する ALTER 権限が必要です。
構文
ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]
alter_clause は6つの操作に分類されます:パーティション、ロールアップ、スキーマ変更、名前変更、インデックス、スワップ、コメント、コンパクト。
- rename: テーブル、ロールアップインデックス、またはパーティションの名前を変更します。
- comment: テーブルコメントを変更します(v3.1以降でサポート)。
- partition: パーティションのプロパティを変更、パーティションを削除、またはパーティションを追加します。
- bucket: バケッティング方法とバケット数を変更します。
- column: 列を追加、削除、または並べ替え、または列タイプを変更します。
- rollup index: ロールアップインデックスを作成または削除します。
- bitmap index: インデックスを変更します(ビットマップインデックスのみ変更可能)。
- swap: 2つのテーブルをアトミックに交換します。
- schema change: 列を追加、削除、または並べ替え、または列タイプを変更します。
- compact: ロードされたデータのバージョンをマージするための手動コンパクションを実行します(v3.1以降でサポート)。
制限と使用上の注意
- パーティション、列、ロールアップインデックスに対する操作は、1つの ALTER TABLE ステートメントで実行できません。
- 列名は変更できません。
- 列コメントは変更できません。
- 1つのテーブルには、同時に1つのスキーマ変更操作しか実行できません。1つのテーブルに対して2つのスキーマ変更コマンドを同時に実行することはできません。
- バケット、列、ロールアップインデックスに対する操作は非同期操作です。タスクが送信された後、すぐに成功メッセージが返されます。進行状況を確認するには SHOW ALTER TABLE コマンドを実行し、操作をキャンセルするには CANCEL ALTER TABLE コマンドを実行します。
- 名前変更、コメント、パーティション、ビットマップインデックス、スワップに対する操作は同期操作であり、コマンドの返り値が実行の完了を示します。
名前変更
名前変更は、テーブル名、ロールアップインデックス、およびパーティション名の変更をサポートします。
テーブルの名前を変更する
ALTER TABLE <tbl_name> RENAME <new_tbl_name>
ロールアップインデックスの名前を変更する
ALTER TABLE [<db_name>.]<tbl_name>
RENAME ROLLUP <old_rollup_name> <new_rollup_name>
パーティションの名前を変更する
ALTER TABLE [<db_name>.]<tbl_name>
RENAME PARTITION <old_partition_name> <new_partition_name>
テーブルコメントの変更 (v3.1以降)
構文:
ALTER TABLE [<db_name>.]<tbl_name> COMMENT = "<new table comment>";
現在、列コメントは変更できません。
パーティションの変更
パーティションを追加する
範囲パーティションまたはリストパーティションを追加できます。式パーティションの追加はサポートされていません。
構文:
-
範囲パーティション
ALTER TABLE
ADD { single_range_partition | multi_range_partitions } [distribution_desc] ["key"="value"];
single_range_partition ::=
PARTITION [IF NOT EXISTS] <partition_name> VALUES partition_key_desc
partition_key_desc ::=
{ LESS THAN { MAXVALUE | value_list }
| [ value_list , value_list ) } -- [ は左閉区間を表します。
value_list ::=
( <value> [, ...] )
multi_range_partitions ::=
{ PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
| PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- START および END で指定されたパーティション列の値が整数であっても、パーティション列の値はダブルクォートで囲む必要があります。ただし、EVERY 節の間隔値はダブルクォートで囲む必要はありません。 -
リストパーティション
ALTER TABLE
ADD PARTITION <partition_name> VALUES IN (value_list) [distribution_desc] ["key"="value"];
value_list ::=
value_item [, ...]
value_item ::=
{ <value> | ( <value> [, ...] ) }
パラメータ:
-
パーティション関連のパラメータ:
- 範囲パーティションの場合、単一の範囲パーティション (
single_range_partition) または複数の範囲パーティションを一括で追加できます (multi_range_partitions)。 - リストパーティションの場合、単一のリストパーティションのみ追加できます。
- 範囲パーティションの場合、単一の範囲パーティション (
-
distribution_desc:新しいパーティションのバケット数を個別に設定できますが、バケッティン グ方法を個別に設定することはできません。
-
"key"="value":新しいパーティションのプロパティを設定できます。詳細は CREATE TABLE を参照してください。
例:
-
範囲パーティション
-
テーブル作成時にパーティション列が
event_dayと指定されている場合、例えばPARTITION BY RANGE(event_day)、テーブル作成後に新しいパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE site_access ADD PARTITION p4 VALUES LESS THAN ("2020-04-30"); -
テーブル作成時にパーティション列が
datekeyと指定されている場合、例えばPARTITION BY RANGE (datekey)、テーブル作成後に複数のパーティションを一括で追加する必要がある場合、以下を実行できます:ALTER TABLE site_access
ADD PARTITIONS START ("2021-01-05") END ("2021-01-10") EVERY (INTERVAL 1 DAY);
-
-
リストパーティション
-
テーブル作成時に単一のパーティション列が指定されている場合、例えば
PARTITION BY LIST (city)、テーブル作成後に新しいパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE t_recharge_detail2
ADD PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego"); -
テーブル作成時に複数のパーティション列が指定されている場合、例えば
PARTITION BY LIST (dt,city)、テーブル作成後に新しいパーティションを追加する必要がある場合、以下を実行できます:ALTER TABLE t_recharge_detail4
ADD PARTITION p202204_California VALUES IN
(
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
);
-
パーティションを削除する
構文:
-- 2.0以前
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [IF EXISTS | FORCE] <partition_name>
-- 2.0以降
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [IF EXISTS] <partition_name> [FORCE]
注意:
- パーティション化されたテーブルには少なくとも1つのパーティションを保持してください。
- DROP PARTITION を実行した後、指定された期間内(デフォルトで1日)に RECOVER コマンドを使用して削除されたパーティションを復元できます。
- DROP PARTITION FORCE を実行すると、パーティションは直接削除され、パーティション上の未完了のアクティビティがあるかどうかを確認せずに復元できなくなります。したがって、一般的にこの操作は推奨されません。
一時パーティションを追加する
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD TEMPORARY PARTITION [IF NOT EXISTS] <partition_name>
partition_desc ["key"="value"]
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]]
一時パーティションを使用して現在のパーティションを置き換える
構文:
ALTER TABLE [<db_name>.]<tbl_name>
REPLACE PARTITION <partition_name>
partition_desc ["key"="value"]
WITH TEMPORARY PARTITION
partition_desc ["key"="value"]
[PROPERTIES ("key"="value", ...)]
一時パーティションを削除する
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP TEMPORARY PARTITION <partition_name>
パーティションプロパティを変更する
構文
ALTER TABLE [<db_name>.]<tbl_name>
MODIFY PARTITION { <partition_name> | ( <partition1_name> [, <partition2_name> ...] ) | (*) }
SET ("key" = "value", ...);
使用法
-
パーティションの以下のプロパティを変更できます:
- 記憶媒体
- storage_cooldown_ttl または storage_cooldown_time
- replication_num
-
パーティションが1つしかないテーブルの場合、パーティション名はテーブル名と同じです。複数のパーティションに分割されている場合、
(*)を使用してすべてのパーティションのプロパティを変更することができ、より便利です。 -
SHOW PARTITIONS FROM <tbl_name>を実行して、変更後のパーティションプロパティを確認します。
スキーマ変更
スキーマ変更は以下の変更をサポートします。