ALTER TABLE
説明
ALTER TABLE は既存のテーブルを修正します。以下を含みます:
- テーブル、パーティション、ロールアップ、または列の名前変更
- テーブルコメントの修正
- パーティションの修正(パーティションの追加/削除とパーティション属性の修正)
- バケッティング方法とバケット数の修正
- 列の変更(列の追加/削除、列順の変更、列コメントの変更)
- ロールアップの作成/削除
- インデックスの作成/削除
- テーブルプロパティの修正
- アトミックスワップ
- 手動データバージョンコンパクション
- 主キー永続性インデックスの削除
この操作には、対象テーブルに対する ALTER 権限が必要です。
構文
ALTER TABLE [<db_name>.]<tbl_name>
alter_clause1[, alter_clause2, ...]
alter_clause には次の操作が含まれます: 名前変更、コメント、パーティション、バケット、列、ロールアップ、インデックス、テーブルプロパティ、スワップ、コンパクション。
- 名前変更: テーブル、ロールアップ、パーティション、または列の名前を変更します(v3.3.2 以降でサポート)。
- コメント: テーブルコメントを修正します(v3.1 以降でサポート)。
- パーティション: パーティションプロパティを修正、パーティションを削除、またはパーティションを追加します。
- バケット: バケッティング方法とバケット数を修正します。
- 列: 列の追加、削除、並び替え、列のタイプの変更、コメントの変更
- ロールアップ: ロールアップを作成または削除します。
- インデックス: インデックスを修正します。
- スワップ: 2つのテーブルをアトミックに交換します。
- コンパクション: ロードされたデータのバージョンをマージするために手動でコンパクションを実行します(v3.1 以降でサポート)。
- 永続性インデックスの削除: 共有データクラスタの主キーテーブルの永続性インデックスを削 除します(v3.3.9 以降でサポート)。
制限と使用上の注意
- パーティション、列、ロールアップに対する操作は、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.3.2 以降、StarRocks は列の名前変更をサポートしています。
ALTER TABLE [<db_name>.]<tbl_name>
RENAME COLUMN <old_col_name> [ TO ] <new_col_name>
- 列 A を B に名前変更した後、新しい列 A を追加することはサポートされていません。
- 名前が変更された列に基づいて構築されたマテリアライズドビューは効果を持ちません。新しい名前の列に基づいて再構築する必要があります。
テーブルコメントの修正 (v3.1 以降)
構文:
ALTER TABLE [<db_name>.]<tbl_name> COMMENT = "<new table comment>";
パーティションの変更
パーティションの追加
レンジパーティションまたはリストパーティションを追加する際は、必ずそれぞれの構文を厳格に遵守する必要があります。
- 式パーティションの追加はサポートされていません。
- 注意:
PARTITION BY date_trunc(column)およびPARTITION BY time_slice(column)は、表現形式が式パーティションであるにもかかわらず、レンジパーティションとして扱われます。したがって、このようなパーティション方法を使用するテーブルに新しいパーティションを追加する際は、以下のレンジパーティションの構文を使用できます。
構文:
-
レンジパーティション
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")
);
-
パーティションの削除
- 単一のパーティションを削除する:
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITION [ IF EXISTS ] <partition_name> [ FORCE ]
- バッチでパーティションを削除する (v3.4.0 以降でサポート):
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITIONS [ IF EXISTS ] { partition_name_list | multi_range_partitions } [ FORCE ]
partition_name_list ::= ( <partition_name> [, ... ] )
multi_range_partitions ::=
{ START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <N> <time_unit> )
| START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <granularity> ) } -- パーティション列の値が整数であっても、ダブルクォートで囲む必要があります。ただし、EVERY 節の間隔値はダブルクォートで囲む必要はありません。
multi_range_partitions の注意事項:
-
これはレンジパーティション化にのみ適用されます。
-
関与するパラメータは ADD PARTITION(S) のものと一致しています。
-
単一のパーティションキーを持つパーティションのみをサポートします。
-
共通パーティション式を使用してパーティションを削除する (v3.5.0 以降でサポート):
ALTER TABLE [<db_name>.]<tbl_name>
DROP PARTITIONS WHERE <expr>
v3.5.0 以降、StarRocks は共通パーティション式を使用したパーティションの削除をサポートしています。削除するパーティションをフィルタリングするために WHERE 句を指定できます。
- 式で宣言されたパーティションが削除されます。式の条件を満たすパーティションはバッチで削除されます。注意して進めてください。
- 式にはパーティション列と定数のみを含めることができます。非パーティション列はサポートされていません。
- 共通パーティション式はリストパーティションとレンジパーティションに異なる方法で適用されます:
- リストパーティションを持つテーブルの場合、StarRocks は共通パーティション式でフィルタリングされたパーティションの削除をサポートします。
- レンジパーティションを持つテーブルの場合、StarRocks は FE のパーティションプルーニング機能を使用してパーティションをフィルタリングおよび削除することしかできません。パーティションプルーニングによってサポートされていない述語に対応するパーティションはフィルタリングおよび削除できません。
例:
-- 過去3か月より前のデータを削除します。列 `dt` はテーブルのパーティション列です。
ALTER TABLE t1 DROP PARTITIONS WHERE dt < CURRENT_DATE() - INTERVAL 3 MONTH;
- パーティション化されたテーブルには少なくとも1つのパーティションを保持してください。
- FORCE が指定されていない場合、指定された期間内(デフォルトで1日)に RECOVER コマンドを使用して削除されたパーティションを復元できます。
- FORCE が指定されている場合、パーティションは未完了の操作があるかどうかに関係なく直接削除され、復元できません。したがって、一般的にはこの操作は推奨されません。
一時パーティションの追加
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD TEMPORARY PARTITION [IF NOT EXISTS] <partition_name>
{ single_range_partition | multi_range_partitions | list_partitions }
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]]
-- single_range_partition および multi_range_partitions の詳細については、このページ内の「パーティションの追加」セクションを参照してください。
list_partitions::=
PARTITION <partition_name> VALUES IN (value_list)
value_list ::=
value_item [, ...]
value_item ::=
{ <value> | ( <value> [, ...] ) }
一時パーティションを使用して現在のパーティションを置き換える
構文:
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>