ALTER TABLE COLUMN
説明
このステートメントは既存のテーブルに対してスキーマ変更操作を実行するために使用されます。スキーマ変更は非同期で、タスクが正常に送信されるとタスクが返されます。その後、SHOW ALTER TABLE COLUMNコマンドを使用して進捗を確認できます。
Dorisはテーブル構築後にマテリアライズドインデックスの概念があります。テーブル構築が成功した後、それがベーステーブルとなり、マテリアライズドインデックスがベースインデックスとなります。rollupインデックスはベーステーブルに基づいて作成できます。ベースインデックスとrollupインデックスの両方がマテリアライズドインデックスです。スキーマ変更操作時にrollup_index_nameが指定されない場合、操作はデフォルトでベーステーブルに基づいて行われます。
Doris 1.2.0では軽量なスケール構造変更のためのlight schema changeをサポートしており、value列の加算・減算操作をより迅速かつ同期的に完了できます。テーブル作成時に手動で"light_schema_change" = 'true'を指定できます。このパラメータはバージョン2.0.0以降ではデフォルトで有効になっています。
文法:
ALTER TABLE [database.]table alter_clause;
schema変更のalter_clauseは、以下の変更方法をサポートしています:
1. 指定されたインデックスの指定された位置にカラムを追加する
文法
ALTER TABLE [database.]table table_name ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"]
[AFTER column_name|FIRST]
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
例
- key_1の後にキー列new_colをexample_db.my_tableに追加する(非集約モデル)
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT KEY DEFAULT "0" AFTER key_1;
- example_db.my_tableのvalue_1の後に値列new_colを追加する(非集約モデル)
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT DEFAULT "0" AFTER value_1;
- example_db.my_tableのkey_1の後にキーカラムnew_col(集計モデル)を追加する
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT KEY DEFAULT "0" AFTER key_1;
- aggregation model (集約モデル) の new_col SUM 集約タイプの後に、example_db.my_table に value_1 の後の value カラムを追加する
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT SUM DEFAULT "0" AFTER value_1;
- example_db.my_tableテーブル(非集約モデル)の最初のカラム位置にnew_colを追加する
ALTER TABLE example_db.my_table
ADD COLUMN new_col INT KEY DEFAULT "0" FIRST;
- 集約モデルにvalueカラムを追加する場合、agg_typeを指定する必要があります
- 非集約モデル(DUPLICATE KEYなど)でkeyカラムを追加する場合、KEYキーワードを指定する必要があります
- base indexに既に存在するカラムをrollup indexに追加することはできません(必要に応じてrollup indexを再作成できます)
2. 指定したインデックスに複数のカラムを追加
文法
ALTER TABLE [database.]table table_name ADD COLUMN (column_name1 column_type [KEY | agg_type] DEFAULT "default_value", ...)
[TO rollup_index_name]
[PROPERTIES ("key"="value", ...)]
例
- example_db.my_tableに複数のカラムを追加します。ここで、new_colとnew_col2はSUM集約タイプです(集約モデル)
ALTER TABLE example_db.my_table
ADD COLUMN (new_col1 INT SUM DEFAULT "0" ,new_col2 INT SUM DEFAULT "0");
- example_db.my_table(非集約モデル)に複数の列を追加します。ここでnew_col1はKEY列、new_col2はvalue列です
ALTER TABLE example_db.my_table
ADD COLUMN (new_col1 INT key DEFAULT "0" , new_col2 INT DEFAULT "0");
- 集約モデルにvalue列を追加する場合は、agg_typeを指定する必要があります
- 集約モデルにkey列を追加する場合は、KEYキーワードを指定する必要があります
- ベースインデックスに既に存在する列をrollupインデックスに追加することはできません(必要に応じてrollupインデックスを再作成できます)
3. 指定されたインデックスから列を削除する
文法
ALTER TABLE [database.]table table_name DROP COLUMN column_name
[FROM rollup_index_name]
例
- example_db.my_tableからカラムcol1を削除する
ALTER TABLE example_db.my_table DROP COLUMN col1;
- パーティション列を削除することはできません
- 集約モデルではKEY列を削除できません
- 列がベースインデックスから削除された場合、rollupインデックスに含まれていても同様に削除されます
4. 指定されたインデックスの列タイプと列位置を変更する
文法
ALTER TABLE [database.]table table_name 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", ...)]
例
- ベースインデックスのキー列col1の型をBIGINTに変更し、col2列の後ろに移動する
ALTER TABLE example_db.my_table
MODIFY COLUMN col1 BIGINT KEY DEFAULT "1" AFTER col2;
キー列または値列のいずれを変更する場合でも、完全な列情報を宣言する必要があります
- base indexのval1列の最大長を変更します。元のval1は (val1 VARCHAR(32) REPLACE DEFAULT "abc") です
ALTER TABLE example_db.my_table
MODIFY COLUMN val1 VARCHAR(64) REPLACE DEFAULT "abc";
列のデータ型のみ変更できます。列の他の属性は変更されずに残る必要があります。
- Duplicate keyテーブルのKeyカラム内のフィールドの長さを変更する
ALTER TABLE example_db.my_table
MODIFY COLUMN k3 VARCHAR(50) KEY NULL COMMENT 'to 50';
- aggregation モデルで value カラムを変更する場合、agg_type を指定する必要があります
- 非集約タイプで key カラムを変更する場合、KEY キーワードを指定する必要があります
- カラムのタイプのみ変更でき、カラムの他の属性はそのまま残ります(つまり、他の属性は元の属性に従ってステートメント内で明示的に記述する必要があります。上記の例2を参照してください)
- パーティショニングとバケッティングのカラムはいかなる方法でも変更できません
- 現在、以下のタイプの変換がサポートされています(精度の損失はユーザーが保証します)
- TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE タイプをより大きな数値タイプへの変換
- TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL を VARCHAR に変換
- VARCHAR は最大長の変更をサポート
- VARCHAR/CHAR を TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE に変換
- VARCHAR/CHAR を DATE に変換(現在 "%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d, "%y/%m/%d" の6つのフォーマットをサポート)
- 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 タイプのデータが不正な場合、変換は失敗し、元のデータは変更されません)
- DATE と DATETIME を除く全ては STRING に変換できますが、STRING は他のタイプには変換できません
5. 指定されたインデックスでカラムを並び替える
文法
ALTER TABLE [database.]table table_name ORDER BY (column_name1, column_name2, ...)
[FROM rollup_index_name]
[PROPERTIES ("key"="value", ...)]
例
- example_db.my_table(非集計モデル)のキーと値の列の順序を調整する
CREATE TABLE `my_table`(
`k_1` INT NULL,
`k_2` INT NULL,
`v_1` INT NULL,
`v_2` varchar NULL,
`v_3` varchar NULL
) ENGINE=OLAP
DUPLICATE KEY(`k_1`, `k_2`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`k_1`) BUCKETS 5
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
ALTER TABLE example_db.my_table ORDER BY (k_2,k_1,v_3,v_2,v_1);
mysql> desc my_table;
+-------+------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-------+---------+-------+
| k_2 | INT | Yes | true | NULL | |
| k_1 | INT | Yes | true | NULL | |
| v_3 | VARCHAR(*) | Yes | false | NULL | NONE |
| v_2 | VARCHAR(*) | Yes | false | NULL | NONE |
| v_1 | INT | Yes | false | NULL | NONE |
+-------+------------+------+-------+---------+-------+
- 2つのアクションを同時に実行する
CREATE TABLE `my_table` (
`k_1` INT NULL,
`k_2` INT NULL,
`v_1` INT NULL,
`v_2` varchar NULL,
`v_3` varchar NULL
) ENGINE=OLAP
DUPLICATE KEY(`k_1`, `k_2`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`k_1`) BUCKETS 5
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
ALTER TABLE example_db.my_table
ADD COLUMN col INT DEFAULT "0" AFTER v_1,
ORDER BY (k_2,k_1,v_3,v_2,v_1,col);
mysql> desc my_table;
+-------+------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-------+---------+-------+
| k_2 | INT | Yes | true | NULL | |
| k_1 | INT | Yes | true | NULL | |
| v_3 | VARCHAR(*) | Yes | false | NULL | NONE |
| v_2 | VARCHAR(*) | Yes | false | NULL | NONE |
| v_1 | INT | Yes | false | NULL | NONE |
| col | INT | Yes | false | 0 | NONE |
+-------+------------+------+-------+---------+-------+
- インデックス内のすべての列が書き出されます
- value列はkey列の後に配置されます
- key列の範囲内でのみkey列を調整できます。value列についても同様です
Keywords
ALTER, TABLE, COLUMN, ALTER TABLE