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つのスキーマ変更操作しか実行できません。同時に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>";
現在、列コメントは修正できません。
パーティションの修正
パーティションの追加
範囲パーティションまたはリストパーティションを追加できます。式パーティションの追加はサポートされていません。
構文:
-
範囲パーティション
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つのパーティションを保持してください。
- FORCEが指定されていない場合、RECOVER コマンドを使用して指定された期間内(デフォルトで1日)に削除されたパーティションを復元できます。
- 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>
を実行します。
バケット法とバケット数の修正 (v3.2以降)
構文:
ALTER TABLE [<db_name>.]<table_name>
[ partition_names ]
[ distribution_desc ]
partition_names ::=
(PARTITION | PARTITIONS) ( <partition_name> [, <partition_name> ...] )
distribution_desc ::=
DISTRIBUTED BY RANDOM [ BUCKETS <num> ] |
DISTRIBUTED BY HASH ( <column_name> [, <column_name> ...] ) [ BUCKETS <num> ]
例:
例えば、元のテーブルはハッシュバケット法を使用し、バケット数は StarRocks によって自動的に設定される重複キーテーブルです。
CREATE TABLE IF NOT EXISTS details (
event_time DATETIME NOT NULL COMMENT "datetime of event",
event_type INT NOT NULL COMMENT "type of event",
user_id INT COMMENT "id of user",
device_code INT COMMENT "device code",
channel INT COMMENT ""
)
DUPLICATE KEY(event_time, event_type)
PARTITION BY date_trunc('day', event_time)
DISTRIBUTED BY HASH(user_id);
-- 数日分のデータを挿入
INSERT INTO details (event_time, event_type, user_id, device_code, channel) VALUES
-- 11月26日のデータ
('2023-11-26 08:00:00', 1, 101, 12345, 2),
('2023-11-26 09:15:00', 2, 102, 54321, 3),
('2023-11-26 10:30:00', 1, 103, 98765, 1),
-- 11月27日のデータ
('2023-11-27 08:30:00', 1, 104, 11111, 2),
('2023-11-27 09:45:00', 2, 105, 22222, 3),
('2023-11-27 11:00:00', 1, 106, 33333, 1),
-- 11月28日のデータ
('2023-11-28 08:00:00', 1, 107, 44444, 2),
('2023-11-28 09:15:00', 2, 108, 55555, 3),
('2023-11-28 10:30:00', 1, 109, 66666, 1);
バケット法のみの修正
注意
- 修正はテーブル内のすべてのパーティションに適用され、特定のパーティションのみに適用することはできません。
- バケット法のみを修正する必要がある場合でも、
BUCKETS <num>
を使用してコマンドでバケット数を指定する必要があります。BUCKETS <num>
が指定されていない場合、バケット数は StarRocks によって自動的に決定されます。
-
バケット法をハッシュバケット法からランダムバケット法に修正し、バケット数は StarRocks によって自動的に設定されます。
ALTER TABLE details DISTRIBUTED BY RANDOM;
-
ハッシュバケット法のキーを
user_id, event_time
に修正し、バケット数は StarRocks によって自動的に設定されます。ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time);
バケット数のみの修正
注意
バケット数のみを修正する必要がある場合でも、バケット法をコマンドで指定する必要があります。例えば、
HASH(user_id)
。
-
すべてのパーティションのバケット数を StarRocks によって自動的に設定さ れるものから10に修正します。
ALTER TABLE details DISTRIBUTED BY HASH(user_id) BUCKETS 10;
-
指定されたパーティションのバケット数を StarRocks によって自動的に設定されるものから15に修正します。
ALTER TABLE details PARTITIONS (p20231127, p20231128) DISTRIBUTED BY HASH(user_id) BUCKETS 15 ;
注意
パーティション名は
SHOW PARTITIONS FROM <table_name>;
を実行して確認できます。
バケット法とバケット数の両方の修正
注意
修正はテーブル内のすべてのパーティションに適用され、特定のパーティションのみに適用することはできません。
-
バケット法をハッシュバケット法からランダムバケット法に修正し、バケット数を StarRocks によって自動的に設定されるものから10に変更します。
ALTER TABLE details DISTRIBUTED BY RANDOM BUCKETS 10;
-
ハッシュバケット法のキーを修正し、バケット数を StarRocks によって自動的に設定されるものから10に変更します。ハッシュバケット法に使用されるキーは、元の
event_time, event_type
からuser_id, event_time
に修正されます。バケット数は StarRocks によって自動的に設定されるものから10に修正されます。ALTER TABLE details DISTRIBUTED BY HASH(user_id, event_time) BUCKETS 10;
列の修正(列の追加/削除、列の順序変更)
指定したインデックスの指定した位置に列を追加
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
- 集計テーブルに値の列を追加する場合、agg_type を指定する必要があります。
- 非集計テーブル(重複キーテーブルなど)にキー列を追加する場合、KEY キーワードを指定する必要があります。
- 基本インデックスに既に存在する列をロールアップインデックスに追加することはできません。(必要に応じてロールアップインデックスを再作成できます。)
指定したインデックスに複数の列を追加
構文:
-
複数の列を追加
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)] -
複数の列を追加し、AFTER を使用して追加された列の位置を指定
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN column_name1 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name,
ADD COLUMN column_name2 column_type [KEY | agg_type] DEFAULT "default_value" AFTER column_name
[, ...]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
注意:
-
集計テーブルに値の列を追加する場合、
agg_type
を指定する必要があります。 -
非集計テーブルにキー列を追加する場合、KEY キーワードを指定する必要があります。
-
基本インデックスに既に存在する列をロールアップインデックスに追加することはできません。(必要に応じて別のロールアップインデックスを作成できます。)
生成列の追加 (v3.1以降)
構文:
ALTER TABLE [<db_name>.]<tbl_name>
ADD COLUMN col_name data_type [NULL] AS generation_expr [COMMENT 'string']
生成列を追加し、その式を指定できます。生成列 は、式の結果を事前に計算して保存するために使用でき、同じ複雑な式を持つクエリを大幅に高速化します。v3.1以降、StarRocksは生成列をサポートしています。
指定したインデックスから列を削除
構文:
ALTER TABLE [<db_name>.]<tbl_name>
DROP COLUMN column_name
[FROM rollup_index_name];
注意:
- パーティション列を削除することはできません。
- 基本インデックスから列を削除すると、ロールアップインデックスに含まれている場合も削除されます。