ALTER TABLE は、AnalyticDB for MySQL の既存のテーブルのスキーマを変更します。このコマンドを使用して、テーブルとカラムの名前変更、カラムのデータ型と制約の変更、インデックスの管理、パーティションライフサイクルの調整、階層型ストレージポリシーの設定ができます。
サンプルテーブル
このトピックのほとんどの例では、customer テーブルを使用します。まだ作成していない場合は、次のステートメントを実行してください。
JSON インデックス、外部キー、ベクトルインデックスの例では、それぞれ独自のテーブル定義を使用します。
構文
ALTER TABLE table_name
{ ADD [COLUMN] column_name column_definition
| ADD [COLUMN] (column_name column_definition,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)
| ADD {INDEX|KEY} [index_name] (column_name)
| ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
| ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
| ADD CLUSTERED [INDEX|KEY] [index_name] (column_name [ASC|DESC])
| ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
| ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
| COMMENT 'comment'
| DROP CLUSTERED KEY index_name
| DROP [COLUMN] column_name
| DROP FOREIGN KEY symbol
| DROP FULLTEXT INDEX index_name
| DROP {INDEX|KEY} index_name
| DROP PARTITION (partition_name,...)
| MODIFY [COLUMN] column_name column_definition
| RENAME COLUMN column_name TO new_column_name
| RENAME new_table_name
| INDEX_ALL = {'Y'|'N'}
| storage_policy
| PARTITION BY VALUE{(column_name)|(DATE_FORMAT(column_name, 'format'))|(FROM_UNIXTIME(column_name, 'format'))} LIFECYCLE N
}
column_definition:
column_type [column_attributes][column_constraints][COMMENT 'comment']
column_attributes:
[DEFAULT{constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT]
column_constraints:
[NULL|NOT NULL]
storage_policy:
STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
テーブル
テーブル名の変更
ALTER TABLE table_name RENAME new_table_name
例: customer を new_customer にリネームします。
ALTER TABLE customer RENAME new_customer;
テーブルコメントの変更
ALTER TABLE table_name COMMENT 'comment'
例: customer テーブルのコメントを更新します。
ALTER TABLE customer COMMENT 'Customer table';
カラム
カラムの追加
ALTER TABLE db_name.table_name ADD [COLUMN]
{column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment']
| (column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}
プライマリキーのカラムは追加できません。
例 1: customer に VARCHAR 型の province カラムを追加します。
ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT 'Province';
[例 2:] ブール型の vip と VARCHAR 型の tags の 2 つのカラムを一度に追加します。
ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'Is VIP', tags VARCHAR DEFAULT 'None' COMMENT 'Tag');
カラムの削除
ALTER TABLE db_name.table_name DROP [COLUMN] column_name
プライマリキーのカラムは削除できません。
例: customer から province カラムを削除します。
ALTER TABLE adb_demo.customer DROP COLUMN province;
カラム名の変更
ALTER TABLE db_name.table_name RENAME COLUMN column_name TO new_column_name
プライマリキーのカラム名は変更できません。
例: customer の city_name を city に変更します。
ALTER TABLE adb_demo.customer RENAME COLUMN city_name TO city;
カラムのデータ型の変更
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type
データ型の変更は、拡大変換のみのルールに従います。データ型が表現できる値の範囲は拡張できますが、縮小はできません。サポートされている変更を次の表にまとめます。
| 変更 | サポート |
|---|---|
| 小さい整数から大きい整数への変更 (例:TINYINT から BIGINT) | はい |
| 大きい整数から小さい整数への変更 (例:BIGINT から TINYINT) | いいえ |
| FLOAT から DOUBLE への変更 | はい |
| DOUBLE から FLOAT への変更 | いいえ |
| 整数型から浮動小数点型 (FLOAT または DOUBLE) への変更 | はい (バージョン要件があります) |
| DECIMAL の精度の増加 | はい (バージョン要件があります) |
| DECIMAL の精度の減少 | いいえ |
| プライマリキーのカラムのデータ型の変更 | いいえ |
整数型から浮動小数点型への変更、および DECIMAL の精度の増加には、カーネルバージョンが 3.1.8.10~3.1.8.x、3.1.9.6~3.1.9.x、3.1.10.3~3.1.10.x、または 3.2.0.1 以降のクラスターが必要です。
例: age カラムを INT から BIGINT に変更します。
ALTER TABLE adb_demo.customer MODIFY COLUMN age BIGINT;
カラムのデフォルト値の変更
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT {constant | CURRENT_TIMESTAMP}
例 1: sex のデフォルト値を 0 に設定します。
ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;
例 2: login_time のデフォルト値を CURRENT_TIMESTAMP に設定します。
ALTER TABLE adb_demo.customer MODIFY COLUMN login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
NULL 値の許可
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type NULL
NOT NULL から NULL への変更のみサポートされています。NULL から NOT NULL への変更はサポートされていません。
例: province カラムで NULL 値を許可します。
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR NULL;
カラムコメントの変更
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type COMMENT 'new_comment'
例: province カラムのコメントを更新します。
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT 'The province where the customer is located';
インデックス
通常のインデックスの追加
デフォルトでは、XUANWU_V2 テーブルは全列インデックスなし (INDEX_ALL='N') で作成されますが、XUANWU テーブルは全列インデックスを含みます (INDEX_ALL='Y')。必要に応じて、個々のカラムにインデックスを追加してください。
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)
カラムは単純なデータ型でなければなりません。JSON カラムについては、「JSON インデックスの追加」をご参照ください。
例: age カラムにインデックスを追加します。
ALTER TABLE adb_demo.customer ADD KEY age_idx(age);
全列インデックスの変更
XUANWU_V2 テーブルでは、テーブル作成後に INDEX_ALL プロパティを使用して全列インデックスを切り替えることができます。この設定は、JSON インデックス、フルテキストインデックス、またはベクトルインデックスには影響しません。
前提条件
XUANWU_V2 テーブルは、カーネルバージョンが 3.2.3.7 以降、または 3.2.4.3 以降のクラスター上に存在する必要があります。
クラスターのマイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、[Cluster Information] ページの [Configuration Information] セクションに移動してください。
ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};
| 値 | 効果 |
|---|---|
Y |
全列インデックスモード:すべてのカラムに通常のインデックスを作成します |
N |
非全列インデックスモード:プライマリキーインデックスのみを保持し、他のすべての通常のインデックスは削除されます |
使用上の注意:
-
XUANWU テーブルの場合、全列インデックスはテーブル作成時にのみ設定できます。無効にするには、インデックスを個別に削除する必要があります。
-
INDEX_ALL='Y'の場合にデータ定義言語 (DDL) 文を使用して通常のインデックスを削除すると、プロパティは自動的にINDEX_ALL='N'に変更されます。対象のインデックスのみが削除され、他のインデックスは影響を受けません。 -
INDEX_ALL='N'の場合、SHOW CREATE TABLEではこのプロパティが明示的に表示されないことがありますが、引き続き有効です。
例 1: customer の全列インデックスを無効にします (現在は INDEX_ALL='Y')。
ALTER TABLE adb_demo.customer INDEX_ALL = 'N';
実行後、customer_name、city_name、sex などのプライマリキー以外のカラムの通常のインデックスは削除されます。
例 2: customer の全列インデックスを有効にします (現在は INDEX_ALL='N' で、customer_id、phone_num、login_time に既存のインデックスがあります)。
ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';
実行後、customer_name、city_name、sex など、まだインデックスがないすべてのカラムに通常のインデックスが作成されます。
JSON インデックスの追加
使用上の注意
JSON インデックスの動作は、テーブルエンジンによって異なります:
-
XUANWU_V2 テーブル (パーティション化されたテーブルとパーティション化されていないテーブル):インデックスはすぐに有効になります。BUILD ジョブは必要ありません。
-
パーティション化されていない XUANWU テーブル:インデックスは、BUILD ジョブが完了した後にのみ有効になります。
-
パーティション化された XUANWU テーブル:手動で全テーブルの BUILD ジョブをトリガーする必要があります。インデックスは、BUILD ジョブが完了した後にのみ有効になります。
JSON インデックス
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
| パラメーター | 説明 |
|---|---|
column_name |
JSON カラムにインデックスを作成します。カラムは JSON 型でなければなりません。 |
column_name->'$.json_path' |
JSON オブジェクト内の特定のプロパティキーにインデックスを作成します。詳細については、「JSON インデックス」をご参照ください。 |
-
column_name->'$.json_path'構文には、クラスターバージョン V3.1.6.8 以降が必要です。マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、[Cluster Information] ページの [Configuration Information] セクションに移動してください。 -
JSON カラムにすでにインデックスがある場合は、そのカラムのプロパティキーにインデックスを作成する前に、既存のインデックスを削除してください。
例: vj カラムの a プロパティに JSON インデックスを作成します。
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1,'{"a":1,"b":2}'),(2,'{"a":2,"b":3}');ALTER TABLE json_test ADD KEY idx_vj_a(vj->'$.a');
JSON 配列インデックス
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
column_name->'$[*]' は、インデックスを作成する JSON 配列カラムを指定します。たとえば、vj->'$[*]' は、vj カラムに JSON 配列インデックスを作成します。
例: vj カラムに JSON 配列インデックスを作成します。
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');
通常のインデックスまたは JSON インデックスの削除
ALTER TABLE db_name.table_name DROP KEY index_name
SHOW INDEX FROM db_name.table_name; を実行してインデックス名を検索してください。
例 1: customer から age_idx インデックスを削除します。
ALTER TABLE adb_demo.customer DROP KEY age_idx;
例 2: json_test から JSON 配列インデックス index_vj を削除します。
ALTER TABLE json_test DROP KEY index_vj;
クラスター化インデックスの追加
ALTER TABLE db_name.table_name ADD CLUSTERED [INDEX|KEY] [index_name] (column_name1 [ASC|DESC], column_name2 [ASC|DESC])
使用上の注意:
-
クラスター化インデックスは、デフォルトで昇順 (ASC) にソートされます。降順でソートするワークロードの場合は、テーブルの作成時に DESC を設定してください。
-
1 つのテーブルに設定できるクラスター化インデックスは 1 つだけです。
-
クラスター化インデックスを追加した後、BUILD ジョブをトリガーし、完了するとインデックスが有効になります。
SHOW CREATE TABLE db_name.table_name;を実行して確認してください。
例: customer_id にクラスター化インデックスを追加します。
ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);
クラスター化インデックスの削除
ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name
SHOW CREATE TABLE db_name.table_name を実行して、クラスター化インデックス名を検索してください。
例: customer から index という名前のクラスター化インデックスを削除します。
ALTER TABLE adb_demo.customer DROP CLUSTERED KEY index;
フルテキストインデックスの追加
前提条件
AnalyticDB for MySQL クラスター V3.1.4.9 以降。最良の結果を得るには、V3.1.4.17 以降を推奨します。
マイナーバージョンの照会方法については、「AnalyticDB for MySQL クラスターのバージョンを照会する方法」をご参照ください。
ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
| パラメーター | 説明 |
|---|---|
column_name |
インデックスを作成するカラム。VARCHAR 型でなければなりません。 |
index_option |
オプション。トークナイザーとカスタム辞書を指定します。 |
WITH ANALYZER analyzer_name |
フルテキストインデックスのアナライザー。詳細については、「フルテキストインデックス用のアナライザー」をご参照ください。 |
WITH DICT tbl_dict_name |
フルテキストインデックスのカスタム辞書。詳細については、「フルテキストインデックス用のカスタム辞書」をご参照ください。 |
フルテキストインデックスは、BUILD ジョブがトリガーされ、完了した後にのみ有効になります。
例: standard アナライザーを使用して、home_address カラムにフルテキストインデックスを追加します。
ALTER TABLE adb_demo.customer ADD FULLTEXT INDEX fidx_k(home_address) WITH ANALYZER standard;
詳細については、「フルテキストインデックスの作成」をご参照ください。
フルテキストインデックスの削除
ALTER TABLE db_name.table_name DROP FULLTEXT INDEX index_name
例: customer から fidx_k フルテキストインデックスを削除します。
ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;
ベクトルインデックスの追加
前提条件
AnalyticDB for MySQL クラスター V3.1.4.0 以降。推奨されるマイナーバージョン:3.1.5.16、3.1.6.8、3.1.8.6 以降。
お使いのクラスターが推奨バージョンのいずれでもない場合は、ベクトル検索を使用する前に [CSTORE_PROJECT_PUSH_DOWN] と CSTORE_PPD_TOP_N_ENABLE を false に設定してください。マイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。マイナーバージョンの照会方法については、「AnalyticDB for MySQL クラスターのバージョンを照会する方法」をご参照ください。
ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ] [distancemeasure=SquaredL2]
| パラメーター | 説明 |
|---|---|
index_name |
インデックス名。命名規則については、「命名制限」セクションをご参照ください。 |
column_name |
インデックスを作成するベクトルカラム。カラムの型は array<float>、array<byte>、または array<smallint> のいずれかである必要があります。 |
algorithm |
ベクトル距離を計算するために使用されるアルゴリズム。HNSW_PQ に設定してください。 |
distancemeasure |
距離計算式。SquaredL2 に設定してください。計算式:(x1-y1)^2 + (x2-y2)^2 + ... + (xn-yn)^2。 |
例: float_feature カラムと short_feature カラムにベクトルインデックスを作成します。
CREATE TABLE vector (
xid BIGINT NOT NULL,
cid BIGINT NOT NULL,
uid VARCHAR NOT NULL,
vid VARCHAR NOT NULL,
wid VARCHAR NOT NULL,
float_feature array<FLOAT>(4),
short_feature array<SMALLINT>(4),
PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);
外部キーの追加
前提条件
AnalyticDB for MySQL クラスター V3.1.10 以降。
マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、[Cluster Information] ページの [Configuration Information] セクションに移動してください。
ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)
| パラメーター | 説明 |
|---|---|
db_name.table_name |
外部キーを追加するテーブル。 |
symbol |
オプション。外部キー制約の名前。テーブル内で一意にする必要があります。省略した場合、パーサーは制約名として <fk_column_name>_fk を使用します。 |
fk_column_name |
外部キーカラム。あらかじめ存在している必要があります。 |
pk_table_name |
親テーブル。あらかじめ存在している必要があります。 |
pk_column_name |
親テーブルのプライマリキーカラム。あらかじめ存在している必要があります。 |
使用上の注意:
-
1 つのテーブルに複数の外部キーインデックスを設定できます。
-
外部キーインデックスは複数のカラムにまたがることはできません (例:
FOREIGN KEY (sr_item_sk, sr_ticket_number)はサポートされていません)。 -
AnalyticDB for MySQL はデータ制約を強制しません。アプリケーションでプライマリキーと外部キーの間の制約関係を検証してください。
-
外部キー制約は外部テーブルに追加できません。
例: item テーブルを参照する外部キーを store_sales に追加します。
CREATE TABLE item
(
i_item_sk BIGINT NOT NULL,
i_current_price BIGINT,
PRIMARY KEY(i_item_sk)
)
DISTRIBUTED BY HASH(i_item_sk);
CREATE TABLE store_sales
(
ss_sale_id BIGINT,
ss_store_sk BIGINT,
ss_item_sk BIGINT NOT NULL,
PRIMARY KEY(ss_sale_id)
);ALTER TABLE store_sales ADD CONSTRAINT ss_item_sk FOREIGN KEY (ss_item_sk) REFERENCES item (i_item_sk);
詳細については、「プライマリキーと外部キーの制約を使用して不要な結合を排除する」をご参照ください。
外部キーの削除
ALTER TABLE db_name.table_name DROP FOREIGN KEY fk_symbol
例:
ALTER TABLE store_returns DROP FOREIGN KEY sr_item_sk_fk;
パーティション
パーティションライフサイクルの変更
ALTER TABLE db_name.table_name PARTITIONS N
注意事項
-
カーネルバージョンが 3.2.4.1 以降のクラスターでは、
Nを0に設定すると、パーティションライフサイクル管理を削除できます。 -
新しいライフサイクルは、BUILD ジョブがトリガーされ、完了した後にのみ有効になります。
SHOW CREATE TABLE db_name.table_name;を実行して確認してください。
例 1:customer テーブルからライフサイクルを削除します。
ALTER TABLE adb_demo.customer PARTITIONS 0;
例 2:ライフサイクルを 30 日から 40 日に変更します。
ALTER TABLE adb_demo.customer PARTITIONS 40;
パーティションのドロップ
ALTER TABLE DROP PARTITIONはTRUNCATE TABLE PARTITIONと同等です。
ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)
パーティションをドロップすると、そのパーティション内のすべてのデータが完全に削除されます。この操作は元に戻せません。
例 1:customer テーブルから 20241220 パーティションをドロップします。
ALTER TABLE adb_demo.customer DROP PARTITION (20241220);
例 2:20241218 および 20241219 パーティションをドロップします。
ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);
ストレージポリシー
階層化ストレージポリシーの変更
前提条件
-
クラスターが Enterprise Edition、Basic Edition、Data Lakehouse Edition、または Data Warehouse Edition (Elastic モード) であること。
-
カーネルバージョンの要件:
-
XUANWU テーブル: カーネルバージョンの制限はありません。
-
XUANWU_V2 テーブル: カーネルバージョンが 3.2.2.15 以降、3.2.3.13 以降、3.2.4.9 以降、または 3.2.5.3 以降である必要があります。
-
マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、[クラスター情報] ページの [設定情報] セクションに移動します。
XUANWU_V2 テーブルでは、ホットストレージとコールドストレージ間でデータを移動するスケジュールされたタスクを有効にする必要があります:
-
ステータスの確認:
SHOW ADB_CONFIG KEY=SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE;-
結果が
FALSEの場合、タスクは無効になっており、有効にする必要があります。 -
エラーが返された場合、パラメーターは設定されておらず、デフォルトで
TRUEになります。
-
-
タスクの有効化:
SET ADB_CONFIG SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE = true;
ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
新しいストレージポリシーは、テーブルに対して BUILD ジョブがトリガーされ、完了した後にのみ有効になります。デフォルトでは、このジョブはバックグラウンドで自動的に実行されます。BUILD ジョブが完了するまでは、information_schema.table_usageが報告するホットパーティションの数が、設定されたポリシーと異なる場合があります。SHOW CREATE TABLE db_name.table_name;を実行して、ポリシーが有効であることを確認してください。
例 1: ストレージポリシーを COLD に設定します。
ALTER TABLE customer storage_policy = 'COLD';
例 2: ストレージポリシーを HOT に設定します。
ALTER TABLE customer storage_policy = 'HOT';
例 3: ストレージポリシーを、ホットパーティション数が 10 の MIXED に設定します。
ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;