メインコンテンツまでスキップ

ALTER TABLE

ALTER TABLE

説明

既存のテーブルを変更します。

注意

この操作には、対象テーブルに対するALTER権限が必要です。

構文

ALTER TABLE [database.]table
alter_clause1[, alter_clause2, ...]

alter_clauseは以下の6つの操作に分類されます: partition, rollup, schema change, rename, index, swap, および comment。

  • partition: パーティションのプロパティを変更したり、パーティションを削除したり、パーティションを追加したりします。
  • rollup: rollupインデックスを作成したり削除したりします。
  • schema change: 列を追加、削除、並び替えしたり、列の型を変更したりします。
  • rename: テーブルやrollupインデックス、パーティションの名前を変更します。 ただし、列名は変更できません。
  • index: インデックスを変更します(Bitmapインデックスのみ変更可能)。
  • swap:2つのテーブルをアトミックに交換します。
  • comment: テーブルのコメントを変更します(v3.1以降)。

注意

  • スキーマの変更、ロールアップ、パーティションの操作は、ALTER TABLEステートメントで同時に実行することはできません。
  • スキーマの変更とロールアップは非同期操作です。タスクが送信された後、すぐに成功メッセージが返されます。進捗状況を確認するには、SHOW ALTER TABLEコマンドを実行できます。
  • パーティション、リネーム、スワップ、インデックスは同期操作であり、コマンドが返された時点で実行が終了していることを示します。

partitionの変更

パーティションの追加

構文:

ALTER TABLE [database.]table 
ADD PARTITION [IF NOT EXISTS] <partition_name>
partition_desc ["key"="value"]
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]];

注意:

  1. Partition_descは次の2つの式をサポートします:

    VALUES LESS THAN [MAXVALUE|("value1", ...)]
    VALUES [("value1", ...), ("value1", ...))
  2. partitionは左閉右開の区間です。ユーザーが右境界のみを指定した場合、システムは自動的に左境界を決定します。

  3. バケットのモードが指定されていない場合、組み込みテーブルが使用するバケットメソッドを自動的に使用します。

  4. バケットモードが指定された場合、バケット番号のみを変更できます。バケットモードまたはバケットカラムは変更できません。

  5. ユーザーは["key"="value"]でパーティションのいくつかのプロパティを設定できます。詳細については、CREATE TABLEを参照してください。

パーティションの削除

構文:

-- 2.0以前
ALTER TABLE [database.]table
DROP PARTITION [IF EXISTS | FORCE] <partition_name>
-- 2.0以降
ALTER TABLE [database.]table
DROP PARTITION [IF EXISTS] <partition_name> [FORCE]

注意:

  1. パーティションテーブルには少なくとも1つのパーティションを保持する必要があります。
  2. DROP PARTITIONを実行してからしばらくすると、削除されたパーティションをRECOVERステートメントで復元することができます。詳細については、RECOVERステートメントを参照してください。
  3. DROP PARTITION FORCEが実行されると、パーティションは直接削除され、パーティション上で未完了のアクティビティがないかどうかを確認せずに復元することはできません。したがって、一般的にはこの操作は推奨されません。

一時パーティションの追加

構文:

ALTER TABLE [database.]table 
ADD TEMPORARY PARTITION [IF NOT EXISTS] <partition_name>
partition_desc ["key"="value"]
[DISTRIBUTED BY HASH (k1[,k2 ...]) [BUCKETS num]]

一時パーティションを現在のパーティションで置換

構文:

ALTER TABLE [database.]table
REPLACE PARTITION <partition_name>
partition_desc ["key"="value"]
WITH TEMPORARY PARTITION
partition_desc ["key"="value"]
[PROPERTIES ("key"="value", ...)]

一時パーティションの削除

構文:

ALTER TABLE [database.]table
DROP TEMPORARY PARTITION <partition_name>

パーティションのプロパティを変更

構文

ALTER TABLE [database.]table
MODIFY PARTITION { <partition_name> | partition_name_list | (*) }
SET ("key" = "value", ...);

用途

  • パーティションの次のプロパティを変更できます:
    • storage_medium
    • storage_cooldown_ttlまたはstorage_cooldown_time
    • replication_num
  • 1つのパーティションしかないテーブルの場合、パーティション名はテーブル名と同じです。テーブルを複数のパーティションに分割している場合は、(*)を使用してすべてのパーティションのプロパティを変更できます。
  • SHOW PARTITIONS FROM <table_name>を実行して変更後のパーティションのプロパティを表示できます。

rollupインデックスの変更

rollupインデックスの作成

構文:

ALTER TABLE [database.]table 
ADD ROLLUP rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)]

PROPERTIES: タイムアウト時間の設定をサポートし、デフォルトのタイムアウト時間は1日です。

例:

ALTER TABLE [database.]table 
ADD ROLLUP r1(col1,col2) from r0;

一括でrollupインデックスを作成

構文:

ALTER TABLE [database.]table
ADD ROLLUP [rollup_name (column_name1, column_name2, ...)
[FROM from_index_name]
[PROPERTIES ("key"="value", ...)],...];

例:

ALTER TABLE [database.]table
ADD ROLLUP r1(col1,col2) from r0, r2(col3,col4) from r0;

注意:

  1. from_index_nameが指定されていない場合、デフォルトでベースインデックスから作成されます。
  2. rollupテーブルの列は、from_indexの既存の列である必要があります。
  3. プロパティでは、ストレージ形式を指定できます。詳細についてはCREATE TABLEを参照してください。

rollupインデックスの削除

構文:

ALTER TABLE [database.]table
DROP ROLLUP rollup_name [PROPERTIES ("key"="value", ...)];

例:

ALTER TABLE [database.]table DROP ROLLUP r1;

一括でrollupインデックスを削除

構文:

ALTER TABLE [database.]table
DROP ROLLUP [rollup_name [PROPERTIES ("key"="value", ...)],...];

例:

ALTER TABLE [database.]table DROP ROLLUP r1, r2;

注意: ベースインデックスを削除することはできません。

スキーマの変更

スキーマの変更では、次の変更をサポートしています。

指定されたインデックスの指定された位置に列を追加

構文:

ALTER TABLE [database.]table
ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]

注意:

1. 集約テーブルに値列を追加する場合、agg_typeを指定する必要があります。
2. 非集約テーブル(Duplicate Keyテーブルなど)にキー列を追加する場合、KEYキーワードを指定する必要があります。
3. ベースインデックスに既に存在する列をrollupインデックスに追加することはできません(必要な場合にはrollupインデックスを再作成できます)。

指定されたインデックスに複数の列を追加

構文:

ALTER TABLE [database.]table
ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]

注意:

  1. 集約テーブルに値列を追加する場合、agg_typeを指定する必要があります。
  2. 非集約テーブルにキー列を追加する場合、KEYキーワードを指定する必要があります。
  3. ベースインデックスに既に存在する列をrollupインデックスに追加することはできません(必要な場合には別のrollupインデックスを作成できます)。

指定されたインデックスから列を削除

構文:

ALTER TABLE [database.]table
DROP COLUMN column_name
[FROM rollup_index_name];

注意:

  1. パーティション列を削除することはできません。
  2. ベースインデックスから列が削除されると、その列がrollupインデックスに含まれている場合も削除されます。

指定されたインデックスの列の型と位置を変更

構文:

ALTER TABLE [database.]table
MODIFY COLUMN column_name column_type [KEY | agg_type] [NULL | NOT NULL] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]

注意:

  1. 集約モデルの値列を変更する場合、agg_typeを指定する必要があります。
  2. 非集計モデルのキー列を変更する場合、KEYキーワードを指定する必要があります。
  3. 列の型のみを変更できます。列のその他のプロパティは現在のままです(つまり、その他のプロパティは元のプロパティに従い、ステートメントに明示的に記述する必要があります。例8を参照)。
  4. パーティション列は変更できません。
  5. 現在、次の型変換をサポートしています(ユーザーは直感的に精度の損失を保証する)。
    • TINYINT/SMALLINT/INT/BIGINTをTINYINT/SMALLINT/INT/BIGINT/DOUBLEに変換します。
    • TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMALをVARCHARに変換します。VARCHARは最大長を変更できます。
    • VARCHARをTINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLEに変換します。
    • VARCHARをDATEに変換します(現在、6つの形式がサポートされています: "%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d, "%y/%m/%d")。
    • DATETIMEをDATEに変換します(年月日の情報のみが保持されます、つまり、 2019-12-09 21:47:05 <--> 2019-12-09)。
    • DATEをDATETIMEに変換します(時刻をゼロに設定します。たとえば: 2019-12-09 <--> 2019-12-09 00:00:00)。
    • FLOATをDOUBLEに変換します。
    • INTをDATEに変換します(INTデータの変換に失敗した場合、元のデータは変更されません)。
  6. NULLからNOT NULLへの変換はサポートされていません。

指定されたインデックスの列の並び順を変更

構文:

ALTER TABLE [database.]table
ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]

注意:

  1. インデックスのすべての列を記述する必要があります。
  2. キー列の後に値列を並べます。

生成列の追加

構文:

ALTER TABLE [database.]table
ADD col_name data_type [NULL] AS generation_expr [COMMENT 'string']

生成列を追加して、その式の結果を事前計算および格納できます。これにより、同じ複雑な式を使用するクエリの実行が大幅に高速化されます。v3.1以降、StarRocksは生成列をサポートしています。

テーブルのプロパティを変更

現在、StarRocksは、 bloom_filter_columnsプロパティ、 colocate_withプロパティ、動的パーティショニング関連のプロパティ、 enable_persistent_indexプロパティ、 replication_numプロパティ、 default.replication_numプロパティ、 storage_cooldown_ttlプロパティ、 storage_cooldown_timeプロパティを変更できます。

構文:

PROPERTIES ("key"="value")

注意: 上記のスキーマ変更操作にマージしてプロパティを変更することもできます。以下の例を参照してください。

リネーム

リネームでは、テーブル名、rollupインデックス、およびパーティション名を変更することができます。

テーブルのリネーム

ALTER TABLE <table_name> RENAME <new_table_name>

rollupインデックスのリネーム

ALTER TABLE [database.]table
RENAME ROLLUP <old_rollup_name> <new_rollup_name>

パーティションのリネーム

ALTER TABLE [database.]table
RENAME PARTITION <old_partition_name> <new_partition_name>

ビットマップインデックスの変更

ビットマップインデックスは、次の変更をサポートしています。

ビットマップインデックスの作成

構文:

 ALTER TABLE [database.]table
ADD INDEX index_name (column [, ...],) [USING BITMAP] [COMMENT 'balabala'];

注意:

1. ビットマップインデックスは現在のバージョンのみサポートされています。
2. BITMAPインデックスは単一の列でのみ作成できます。

インデックスの削除

構文:

DROP INDEX index_name;

Swap

Swapは2つのテーブルをアトミックに交換することをサポートしています。

構文:

ALTER TABLE [database.]table
SWAP WITH table_name;

テーブルのコメント変更(v3.1以降)

構文:

ALTER TABLE [database.]table COMMENT = "<new table comment>";

テーブル

  1. テーブルのデフォルトのレプリカ数を変更し、新しく追加されたパーティションのデフォルトのレプリカ数に使用します。

    ALTER TABLE example_db.my_table
    SET ("default.replication_num" = "2");
  2. 単一パーティションテーブルの実際のレプリカ数を変更します。

    ALTER TABLE example_db.my_table
    SET ("replication_num" = "3");
  3. データの書き込みとレプリケーションモードをレプリカ間で変更します。

    ALTER TABLE example_db.my_table
    SET ("replicated_storage" = "false");

    この例では、データの書き込みとレプリケーションモードを "リーダーレスレプリケーション" に設定しています。これは、データがプライマリレプリカとセカンダリレプリカを区別せずに複数のレプリカに同時に書き込まれることを意味します。詳細については、CREATE TABLEreplicated_storageパラメータを参照してください。

パーティション

  1. 既存のパーティションが [MIN, 2013-01-01) であり、追加されるパーティションは [2013-01-01, 2014-01-01) の場合。

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2014-01-01");
  2. バケットのモードを指定してパーティションを追加します。

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
    DISTRIBUTED BY HASH(k1);
  3. レプリカ数を変更してパーティションを追加します。

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES LESS THAN ("2015-01-01")
    ("replication_num"="1");
  4. パーティションごとのレプリカ数を変更します。

    ALTER TABLE example_db.my_table
    MODIFY PARTITION p1 SET("replication_num"="1");
  5. 複数のパーティションのレプリカ数を一括で変更します。

    ALTER TABLE example_db.my_table
    MODIFY PARTITION (p1, p2, p4) SET("replication_num"="1");
  6. すべてのパーティションのストレージメディアを一括で変更します。

    ALTER TABLE example_db.my_table
    MODIFY PARTITION (*) SET("storage_medium"="HDD");
  7. パーティションを削除します。

    ALTER TABLE example_db.my_table
    DROP PARTITION p1;
  8. 上限と下限を持つパーティションを追加します。

    ALTER TABLE example_db.my_table
    ADD PARTITION p1 VALUES [("2014-01-01"), ("2014-02-01"));

rollup

  1. ベースインデックス(k1,k2,k3,v1,v2)を元にexample_rollup_indexを作成します。列ベースのストレージを使用します。

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index(k1, k3, v1, v2)
    PROPERTIES("storage_type"="column");
  2. example_rollup_index(k1, k3, v1, v2)をベースにexample_rollup_index2を作成します。

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index2 (k1, v1)
    FROM example_rollup_index;
  3. ベースインデックス(k1, k2, k3, v1)を元に、example_rollup_index3を作成します。タイムアウト時間を1時間に設定します。

    ALTER TABLE example_db.my_table
    ADD ROLLUP example_rollup_index3(k1, k3, v1)
    PROPERTIES("storage_type"="column", "timeout" = "3600");
  4. example_rollup_index2を削除します。

    ALTER TABLE example_db.my_table
    DROP ROLLUP example_rollup_index2;

スキーマ変更

  1. example_rollup_indexcol1の後ろにキー列new_col(非集約列)を追加します。

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT KEY DEFAULT "0" AFTER col1
    TO example_rollup_index;
  2. example_rollup_indexcol1の後ろに値列new_col(非集約列)を追加します。

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT DEFAULT "0" AFTER col1
    TO example_rollup_index;
  3. example_rollup_indexcol1の後ろにキー列new_col(集約列)を追加します。

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT DEFAULT "0" AFTER col1
    TO example_rollup_index;
  4. example_rollup_indexcol1の後ろに値列new_col SUM(集約列)を追加します。

    ALTER TABLE example_db.my_table
    ADD COLUMN new_col INT SUM DEFAULT "0" AFTER col1
    TO example_rollup_index;
  5. example_rollup_indexに複数の列を追加します(集約)。

    ALTER TABLE example_db.my_table
    ADD COLUMN (col1 INT DEFAULT "1", col2 FLOAT SUM DEFAULT "2.3")
    TO example_rollup_index;
  6. example_rollup_indexから列を削除します。

    ALTER TABLE example_db.my_table
    DROP COLUMN col2
    FROM example_rollup_index;
  7. ベースインデックスのcol1の型をBIGINTに変更し、col2の後ろに配置します。

    ALTER TABLE example_db.my_table
    MODIFY COLUMN col1 BIGINT DEFAULT "1" AFTER col2;
  8. ベースインデックスのval1の最大長を64に変更します。元の長さは32です。

    ALTER TABLE example_db.my_table
    MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc";
  9. example_rollup_indexの列の順序を変更します。元の列順序はk1、k2、k3、v1、v2です。

    ALTER TABLE example_db.my_table
    ORDER BY (k3,k1,k2,v2,v1)
    FROM example_rollup_index;
  10. 2つの操作(ADD COLUMNおよびORDER BY)を同時に実行します。

    ALTER TABLE example_db.my_table
    ADD COLUMN v2 INT MAX DEFAULT "0" AFTER k2 TO example_rollup_index,
    ORDER BY (k3,k1,k2,v2,v1) FROM example_rollup_index;
  11. テーブルのブルームフィルターカラムを変更します。

    ALTER TABLE example_db.my_table
    SET ("bloom_filter_columns"="k1,k2,k3");

    この操作は、上記のスキーマ変更操作にマージして実行することもできます(複数の節の文法がわずかに異なることに注意してください)。

    ALTER TABLE example_db.my_table
    DROP COLUMN col2
    PROPERTIES ("bloom_filter_columns"="k1,k2,k3");
  12. テーブルのColocateプロパティを変更します。

    ALTER TABLE example_db.my_table
    SET ("colocate_with" = "t1");
  13. テーブルのバケットモードをランダムディストリビューションからハッシュディストリビューションに変更します。

    ALTER TABLE example_db.my_table
    SET ("distribution_type" = "hash");
  14. テーブルの動的パーティショニングプロパティを変更します。

    ALTER TABLE example_db.my_table
    SET ("dynamic_partition.enable" = "false");

    動的パーティショニングプロパティが構成されていないテーブルに動的パーティショニングプロパティを追加する場合は、すべての動的パーティショニングプロパティを指定する必要があります。

    ALTER TABLE example_db.my_table
    SET (
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.buckets" = "32"
    );

リネーム

  1. table1table2にリネームします。

    ALTER TABLE table1 RENAME table2;
  2. example_tableのrollupインデックス rollup1rollup2 にリネームします。

    ALTER TABLE example_table RENAME ROLLUP rollup1 rollup2;
  3. example_tableのパーティション p1p2 にリネームします。

    ALTER TABLE example_table RENAME PARTITION p1 p2;

インデックス

  1. table1siteidのビットマップインデックスを作成します。

    ALTER TABLE table1
    ADD INDEX index_1 (siteid) [USING BITMAP] COMMENT 'balabala';
  2. table1siteidのビットマップインデックスを削除します。

    ALTER TABLE table1
    DROP INDEX index_1;

Swap

  1. table1table2の間でアトミックにスワップします。
    ALTER TABLE table1 SWAP WITH table2

参考