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

AnalyticDB:ALTER TABLE

最終更新日:Nov 12, 2025

AnalyticDB for MySQL では、ALTER TABLE 文を使用してテーブルスキーマを変更できます。この文を使用すると、テーブル名、列名、列のデータ型、通常のインデックス、クラスター化インデックス、外部キー、パーティション関数のフォーマット、および階層型ストレージポリシーを変更できます。このトピックでは、ALTER TABLE 構文について説明します。

構文

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}

このトピックのすべての例は、JSON インデックス、外部キー、およびベクトルインデックスに関連するものを除き、CREATE TABLE トピックで作成された customer テーブルに基づいています。customer テーブルをすでに作成している場合は、このトピックの例を実行できます。作成していない場合は、次の文をコピーして実行し、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 '顧客情報テーブル';                   

テーブル

テーブル名の変更

構文

ALTER TABLE db_name.table_name RENAME new_table_name

customer テーブルの名前を new_customer に変更します。

ALTER TABLE customer RENAME new_customer;

テーブルコメントの変更

構文

ALTER TABLE db_name.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 column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}

注意

プライマリキー列は追加できません。

  • customer テーブルに VARCHAR 型の province という名前の列を追加します。

ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT 'Province';
  • customer テーブルに 2 つの列を追加します。BOOLEAN 型の vip という名前の列と、VARCHAR 型の tags という名前の列です。

ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'VIP かどうか',tags VARCHAR DEFAULT 'None' COMMENT 'タグ');

列の削除

構文

ALTER TABLE db_name.table_name DROP [COLUMN] column_name

注意事項

プライマリキー列は削除できません。

customer テーブルから VARCHAR 型の 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 customer RENAME COLUMN city_name to city;

列のデータ型の変更

構文

ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type

注意

  • プライマリキー列のデータ型は変更できません。

  • データ型の変更には、次の制限が適用されます。

    • データ型は、より広い値の範囲を持つ別のデータ型にのみ変更できます。

    • 整数データ型: TINYINT から BIGINT など、より小さい整数型をより大きい整数型に変更できます。BIGINT から TINYINT には変更できません。サポートされている整数型は、TINYINT、SMALLINT、INT、および BIGINT です。

    • 浮動小数点データ型: FLOAT を DOUBLE に変更できますが、DOUBLE を FLOAT に変更することはできません。

    • 整数データ型 (TINYINT、SMALLINT、INT、または BIGINT) を浮動小数点データ型 (FLOAT または DOUBLE) に変更できます。

    • 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 以降のクラスターのみが、整数データ型から浮動小数点データ型への変更と DECIMAL 型の精度の変更をサポートしています。

customer テーブルの 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}

  • customer テーブルの sex 列のデフォルト値を 0 に設定します。

ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;
  • customer テーブルの 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 にのみ変更できます。

customer テーブルの 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'

customer テーブルの province 列のコメントを '顧客が所在する省' に変更します。

ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT 'The province where the customer is located';

インデックス

インデックスの追加

デフォルトでは、AnalyticDB for MySQL は XUANWU_V2 テーブル (INDEX_ALL='N') のフルカラムインデックスを作成しませんが、XUANWU テーブル (INDEX_ALL='Y') の場合は作成します。XUANWU_V2 または XUANWU テーブルを作成したときにフルカラムインデックスが作成されなかった場合は、列にインデックスを追加できます。

構文

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)

パラメーターの説明

column_name: 列の名前。列は単純なデータ型である必要があります。列が JSON データ型の場合は、「JSON インデックスの追加」をご参照ください。

customer テーブルの age 列にインデックスを追加します。

ALTER TABLE adb_demo.customer ADD KEY age_idx(age);

フルカラムインデックスの変更

AnalyticDB for MySQL の XUANWU_V2 テーブルでは、テーブル作成後にフルカラムインデックスを変更できます。これは、テーブルプロパティ INDEX_ALL を使用して設定されます。この操作は、JSON、フルテキスト、ベクトルインデックスなどの非通常のインデックスには影響しません。

前提条件

XUANWU_V2 テーブルは、メジャーエンジンバージョンが 3.2.3.7 以降、または 3.2.4.3 以降のクラスターにあります。

説明

マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、構成情報 セクションの クラスター情報 ページに移動します。

構文

ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};

パラメーターの説明

INDEX_ALL: すべての列に通常のインデックスを作成するかどうかを指定します。有効な値:

  • Y: フルカラムインデックスモード。 すべての列に通常のインデックスを作成します。

    テーブルプロパティを INDEX_ALL='N' から INDEX_ALL='Y' に変更すると、インデックスがないすべての列に通常のインデックスが作成されます。

  • N: 非フルカラムインデックスモード。 プライマリキーにのみ通常のインデックスを作成します。他の列には通常のインデックスはありません。

    テーブルプロパティを INDEX_ALL='Y' から INDEX_ALL='N' に変更すると、プライマリキー列のインデックスを除き、すべての通常のインデックスが削除されます。

注意

  • XUANWU テーブルの場合、フルカラムインデックス機能はテーブル作成時にのみ設定できます。フルカラムインデックスを無効にするには、インデックスを削除する文を実行してインデックスを手動で削除する必要があります。

  • INDEX_ALL='Y' の場合、データ定義言語 (DDL) 文を実行して通常のインデックスを削除すると、プロパティが自動的に INDEX_ALL='Y' から INDEX_ALL='N'に変更されます。この操作は、ターゲットの通常のインデックスのみを削除し、他の通常のインデックスには影響しません。

  • テーブルプロパティが INDEX_ALL='N' の場合、SHOW CREATE TABLE 文ではプロパティが INDEX_ALL='N' として明示的に表示されない場合があります。ただし、有効になるプロパティは依然として INDEX_ALL='N'です。

  • customer テーブルに INDEX_ALL='Y' があると仮定します。次の文を実行して、テーブルプロパティを INDEX_ALL='N' に変更します。

    ALTER TABLE adb_demo.customer INDEX_ALL = 'N';

    文が実行されると、customer_namecity_namesex などのすべての非プライマリキー列の通常のインデックスが削除されます。

  • customer テーブルに INDEX_ALL='N' があり、customer_idphone_numlogin_time フィールドにすでにインデックスがあると仮定します。次の文を実行して、テーブルプロパティを INDEX_ALL='Y' に変更します。

    ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';

    文が実行されると、customer_namecity_namesex など、まだインデックスがない列に通常のインデックスが作成されます。

JSON インデックスの追加

注意

  • XUANWU_V2 テーブル (パーティション化および非パーティション化) の場合、作成した JSON インデックスまたは JSON 配列インデックスは、BUILD ジョブを必要とせずにすぐに有効になります。

  • 非パーティション化 XUANWU テーブルの場合、作成した JSON インデックスまたは JSON 配列インデックスは、BUILD ジョブが完了した後にのみ有効になります。

  • パーティション化 XUANWU テーブルの場合、手動でテーブル全体の BUILD ジョブを強制する必要があります。作成した JSON インデックスまたは JSON 配列インデックスは、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 オブジェクト内の特定のプロパティキーにインデックスを作成します。column_name で指定された列は JSON 型である必要があります。詳細については、「JSON インデックス」をご参照ください。

    重要
    • V3.1.6.8 以降の AnalyticDB for MySQL クラスターのみが column_name->'$.json_path パラメーターをサポートしています。

    • JSON 列にすでにインデックスがある場合は、JSON 列のプロパティキーのインデックスを作成する前に、JSON 列のインデックスを削除する必要があります。

テーブルスキーマと INSERT 文が次のようになっていると仮定します。

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}'));

json_test テーブルの vj 列の a プロパティに JSON インデックスを作成します。

ALTER TABLE json_test ADD KEY age_idx(vj->'$.a');

JSON 配列インデックス

構文

ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')

パラメーターの説明

column_name->'$[*]': column_name は JSON 配列インデックスの列です。たとえば、vj->'$[*]' は vj 列に JSON 配列インデックスを作成します。

テーブルスキーマと INSERT 文が次のようになっていると仮定します。

CREATE TABLE json_test(
  id INT,
  vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');

json_test テーブルの vj 列に JSON 配列インデックスを作成します。

ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');

インデックスまたは JSON インデックスの削除

構文

ALTER TABLE db_name.table_name DROP KEY index_name

パラメーターの説明

index_name: 通常のインデックスの名前。SHOW INDEX FROM db_name.table_name; を実行して index_name を見つけることができます。

  • customer テーブルから age_idx という名前のインデックスを削除します。

    ALTER TABLE adb_demo.customer DROP KEY age_idx;
  • json_test テーブルから index_vj という名前の JSON 配列インデックスを削除します。

    ALTER TABLE adb_demo.customer 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 つしか含めることができません。すでに存在する場合、別のクラスター化インデックスを追加することはできません。

  • クラスター化インデックスを追加した後、クラスター化インデックスを有効にするには、BUILD ジョブをトリガーして完了する必要があります。SHOW CREATE TABLE db_name.table_name; 文を実行して、クラスター化インデックスが有効になったかどうかを判断できます。

customer テーブルの customer_id 列にクラスター化インデックスを追加できます。

ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);

クラスター化インデックスの削除

構文

ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name

パラメーターの説明

index_name: クラスター化インデックスの名前。SHOW CREATE TABLE db_name.table_name を実行してクラスター化インデックス名を見つけることができます。

customer テーブルから index という名前のクラスター化インデックスを削除します。

ALTER TABLE adb_demo.customer DROP CLUSTERED KEY index;

フルテキストインデックスの追加

前提条件

V3.1.4.9 以降の 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: フルテキストインデックスに使用されるアナライザを指定します。AnalyticDB for MySQL でサポートされているアナライザの詳細については、「フルテキストインデックスのアナライザ」をご参照ください。

    • WITH DICT tbl_dict_name: フルテキストインデックスに使用されるカスタム辞書を指定します。AnalyticDB for MySQL でサポートされているカスタム辞書の詳細については、「フルテキストインデックスのカスタム辞書」をご参照ください。

注意

作成したフルテキストインデックスは、BUILDジョブが再トリガーされて完了した後にのみ有効になります。

customer テーブルの 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

パラメーターの説明

  • column_name: フルテキストインデックスを作成する列の名前。列は VARCHAR 型である必要があります。

  • index_option: フルテキストインデックスに使用するアナライザとカスタム辞書。このパラメーターはオプションです。

    • WITH ANALYZER analyzer_name: フルテキストインデックスに使用するアナライザを指定します。AnalyticDB for MySQL でサポートされているアナライザの詳細については、「フルテキストインデックスのアナライザ」をご参照ください。

    • WITH DICT tbl_dict_name: フルテキストインデックスに使用するカスタム辞書を指定します。AnalyticDB for MySQL でサポートされているカスタム辞書の詳細については、「フルテキストインデックスのカスタム辞書」をご参照ください。

customer テーブルからフルテキストインデックス fidx_k を削除します。

ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;

詳細については、「フルテキストインデックスを作成する」をご参照ください。

ベクトルインデックスの追加

前提条件

V3.1.4.0 以降の AnalyticDB for MySQL クラスターが作成されていること。

説明
  • ベクトル検索機能を使用するには、次のマイナーバージョンを使用することをお勧めします: 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 クラスターのマイナーバージョンをクエリする方法については、「AnalyticDB for MySQL クラスターのバージョンをクエリする方法」をご参照ください。クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

構文

ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]

パラメーターの説明

  • index_name: インデックスの名前。インデックスの命名規則については、「Limits」トピックの「命名制限」セクションをご参照ください。

  • column_name: ベクトル列の名前。列の型は array <float>array <byte>、または array <smallint> である必要があります。

  • algorithm: ベクトル距離の計算に使用されるアルゴリズム。値を HNSW_PQ に設定します。

  • distancemeasure: ベクトル距離の計算に使用される数式。値を SquaredL2 に設定します。SquaredL2 の計算式: (x1 - y1)<sup>2</sup> + (x2 - y2)<sup>2</sup> + ...(xn - yn)<sup>2</sup>

次の文を使用して作成された vector という名前のテーブルがあるとします。

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);

float_feature 列と short_feature 列にベクトルインデックスを作成します。

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 クラスターは、カーネルバージョン 3.1.10 以降を実行している必要があります。

説明

マイナーバージョンを表示および更新するには、AnalyticDB for MySQL コンソールにログインし、構成情報 セクションの クラスター情報 ページに移動します。

構文

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: オプション。外部キー制約の名前。テーブル内で一意である必要があります。指定しない場合、Resolver は自動的にサフィックス _fk を外部キー列名に制約名として追加します。

  • fk_column_name: 外部キー列を指定します。外部キー列は CREATE TABLE 文で定義する必要があります。

  • pk_table_name: プライマリテーブル名を指定します。プライマリテーブルはすでに存在している必要があります。

  • pk_column_name: 外部キー制約列を指定します。この列は存在し、プライマリテーブルのプライマリキー列である必要があります。

注意

  • 各テーブルには複数の外部キーインデックスを含めることができます。

  • 複数の列で構成される複合外部キーインデックスはサポートされていません。たとえば、FOREIGN KEY (sr_item_sk, sr_ticket_number) REFERENCES store_sales(ss_item_sk,d_date_sk) はサポートされていません。

  • AnalyticDB for MySQL はデータ制約チェックを実行しません。プライマリテーブルのプライマリキーと詳細テーブルの外部キーの間のデータ制約関係を確保する必要があります。

  • 外部テーブルに外部キー制約を作成することはできません。

次の文を使用して作成された itemstore_sales の 2 つのテーブルがあるとします。

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)
);

store_sales テーブルに外部キー ss_item_sk を追加し、それを item テーブルの i_item_sk キーに関連付けます。

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 以降のクラスターでは、LIFECYCLE パラメーター N0 に設定することで、パーティションのライフサイクル管理を削除できます。

  • パーティションのライフサイクルを変更した後、新しいライフサイクルを有効にするには、BUILDタスクをトリガーして完了する必要があります。SHOW CREATE TABLE db_name.table_name; 文を実行して、新しいライフサイクルが有効になったかどうかを確認できます。

例 1

customer テーブルからライフサイクルを削除します。

ALTER TABLE customer PARTITIONS 0;

例 2

customer テーブルのライフサイクルを 30 から 40 に変更します。

ALTER TABLE customer PARTITIONS 40;

パーティションの削除

説明

ALTER TABLE DROP PARTITION 文は、<a baseurl="t1854474_v6_2_0.xdita" data-node="2138850" data-root="56091" data-tag="xref" href="t1854487.xdita#" id="0a822ac288leo">TRUNCATE TABLE</a> PARTITION 文と同じです。

構文

ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)

注意

パーティションを削除すると、そのパーティション内のデータも削除され、回復できません。この操作を実行するときは注意してください。

  • customer テーブルから 20241220 パーティションを削除します。

    ALTER TABLE adb_demo.customer DROP PARTITION (20241220);
  • customer テーブルから 2024121820241219 のパーティションを削除します。

    ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);

ストレージポリシー

階層型ストレージポリシーの変更

前提条件

  • クラスターは、Enterprise EditionBasic EditionData Lakehouse Edition、または Data Warehouse Edition (Elastic mode) です。

  • カーネルバージョン:

    • テーブルエンジンが 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; を実行して、新しいストレージポリシーが有効になったかどうかを確認できます。

  • customer テーブルのストレージポリシーを COLD に変更します。

    ALTER TABLE customer storage_policy = 'COLD';
  • customer テーブルのストレージポリシーを HOT に変更します。

    ALTER TABLE customer storage_policy = 'HOT';
  • customer テーブルのストレージポリシーを MIXED に変更し、ホットパーティションの数を 10 に設定します。

    ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;

よくある質問

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

列の順序は変更できません。

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

AnalyticDB for MySQL は、varchar および binary 文字列型をサポートしています。AnalyticDB for MySQL の varchar 型は、MySQL の charvarchartextmediumtext、および longtext 型に対応します。したがって、VARCHAR 列を LONGTEXT に変更する必要はありません。

データを含む既存のテーブルに自動インクリメント列を追加した場合、既存データの列は自動的に入力されますか?

いいえ、入力されません。すでにデータが含まれている既存のテーブルに自動インクリメント列を追加すると、新しく書き込まれたデータのみが自動インクリメント値を持つようになります。既存データの自動インクリメント列に入力するには、自動インクリメント列を含む新しいテーブルを作成し、データを新しいテーブルに移行する必要があります。

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

AnalyticDB for MySQL は、分散キーまたはパーティションキーの追加、削除、または変更をサポートしていません。ビジネスで分散キーまたはパーティションキーの変更が必要な場合は、次のソリューションを使用できます。

`order` という名前のテーブルがあり、その分散キーを `order_id` から `customer_id` に変更する必要があるとします。次のステップを実行できます。

  1. `customer_id` を分散キーとして、`order_auto_opt_v1` という名前の一時テーブルを作成します。

    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) --分散キーを order_id から 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 <source_table_name> to <new_source_table_name>; を使用して、ソーステーブルの名前を変更します。

    RENAME TABLE order to order_backup; --データインポートが完了したら、バックアップのためにソーステーブルの名前を変更します。
  5. RENAME TABLE <temporary_table_name> to <source_table_name>; を使用して、一時テーブルの名前をソーステーブル名に変更します。

    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"}`。

原因: テーブルにはクラスター化インデックスを 1 つしか含めることができません。すでに 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; を実行して、BUILD ジョブのステータスを表示できます。