すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:ALTER TABLE

最終更新日:Sep 17, 2026

ALTER TABLE は、AnalyticDB for MySQL の既存のテーブルのスキーマを変更します。このコマンドを使用して、テーブルとカラムの名前変更、カラムのデータ型と制約の変更、インデックスの管理、パーティションライフサイクルの調整、階層型ストレージポリシーの設定ができます。

サンプルテーブル

このトピックのほとんどの例では、customer テーブルを使用します。まだ作成していない場合は、次のステートメントを実行してください。

テーブル作成のサンプルステートメント

CREATE TABLE customer (
  customer_id BIGINT NOT NULL COMMENT '顧客ID',
  customer_name VARCHAR NOT NULL COMMENT '顧客名',
  phone_num BIGINT NOT NULL COMMENT '電話番号',
  city_name VARCHAR NOT NULL COMMENT '都市',
  sex INT NOT NULL COMMENT '性別',
  id_number VARCHAR NOT NULL COMMENT 'IDカード番号',
  home_address VARCHAR NOT NULL COMMENT '自宅住所',
  office_address VARCHAR NOT NULL COMMENT '勤務先住所',
  age INT NOT NULL COMMENT '年齢',
  login_time TIMESTAMP NOT NULL COMMENT 'ログイン時刻',
  PRIMARY KEY (login_time,customer_id,phone_num)
 )
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT '顧客情報テーブル';

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;

よくある質問

列の順序を変更できますか?

いいえ。 AnalyticDB for MySQL では、列の順序を変更することはできません。

VARCHAR 列を LONGTEXT に変更するにはどうすればよいですか?

変換は不要です。 AnalyticDB for MySQL の VARCHAR 型は、MySQL の CHAR、VARCHAR、TEXT、MEDIUMTEXT、および LONGTEXT に相当します。これらのデータ型間に機能的な違いはありません。

すでにデータが存在するテーブルに AUTO_INCREMENT 列を追加した場合、履歴行にも値が設定されますか?

いいえ。 新しく挿入された行にのみ、自動インクリメントされた値が設定されます。履歴行をバックフィルするには、AUTO_INCREMENT 列を含む新しいテーブルを作成し、そこにデータを移行します。

分散キーまたはパーティションキーを変更できますか?

いいえ。 AnalyticDB for MySQL は、分散キーまたはパーティションキーの追加、削除、変更をサポートしていません。これらを変更するには、新しいテーブルを作成してデータを移行します:

  1. 目的の分散キーを持つ新しいテーブルを作成します。 例: order の分散キーを order_id から customer_id に変更します。

    CREATE TABLE order_auto_opt_v1 (
      order_id bigint NOT NULL COMMENT '注文 ID',
      customer_id bigint NOT NULL COMMENT '顧客 ID',
      customer_name varchar NOT NULL COMMENT '顧客名',
      order_time timestamp NOT NULL COMMENT '注文時刻',
      -- 他のフィールドは省略
      PRIMARY KEY (order_id,customer_id,order_time) -- 分散キー customer_id とパーティションキー order_time はプライマリキーに含まれている必要があります。
    )
    DISTRIBUTED BY HASH(customer_id)
    PARTITION BY VALUE(DATE_FORMAT(order_time, '%Y%m%d')) LIFECYCLE 90
    COMMENT '注文情報テーブル';
  2. ソーステーブルから INSERT OVERWRITE SELECT を使用してデータをインポートします。詳細については、「INSERT OVERWRITE SELECT」をご参照ください。

    INSERT OVERWRITE order_auto_opt_v1
    SELECT * FROM order;
  3. データスキューを確認します。インポート後、新しい分散キーがスキューを引き起こさないことを確認します。詳細については、「ストレージ診断」をご参照ください。

  4. バックアップのためにソーステーブルの名前を変更します。

    RENAME TABLE order TO order_backup;
  5. 新しいテーブルの名前を元の名前に変更します。

    RENAME TABLE order_auto_opt_v1 TO order;

プライマリキーを追加または変更できますか?

いいえ。 以下のプライマリキー操作はサポートされていません:

  • プライマリキーの追加または削除

  • プライマリキーのないテーブルをプライマリキーのあるテーブルに変換すること、またはその逆の操作

  • プライマリキー列の追加または削除

  • プライマリキー列の名前の変更

  • プライマリキー列のデータ型の変更

ライフサイクルまたは階層型ストレージポリシーの変更が有効にならないのはなぜですか?

この変更は、テーブルに対して BUILD ジョブがトリガーされ、完了した後にのみ有効になります。 SHOW CREATE TABLE db_name.table_name; を実行して、新しい設定が有効になっていることを確認してください。

トラブルシューティング

syntax error, error in: 'DISTRIBUTE BY HASH(id) PARTITION BY VAL...'

プライマリキー、パーティションキー、分散キーは、テーブル作成後に変更できません。このような変更を行うには、新しいテーブルを作成してデータを移行してください。

Do not allow concurrent add cluster/zorder index task

完全なエラーメッセージは次のとおりです:

Do not allow concurrent add cluster/zorder index task, which in progress: {"clusterColumnIds":[2],"clusterColumns":["phone_num"],"clusterIndexName":"index1","indexOptions":"ASC","type":"ADD_CLUSTERING_KEY"}

原因: ALTER TABLE ... ADD CLUSTERED KEY を実行しましたが、それを有効にする BUILD ジョブがまだ完了していません。最初のインデックスが有効になる前に別のクラスター化インデックスを追加しようとすると、このエラーが発生します。

解決策: BUILD ジョブが自動的に実行されるのを待つか、手動で実行してください。BUILD ジョブが完了してクラスター化インデックスが有効になった後、既存のインデックスをドロップして新しいインデックスを追加することで変更できます。

BUILD ジョブのステータスを確認するには:

SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;