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

AnalyticDB:テーブルの変更

最終更新日:Aug 07, 2024

AnalyticDB for MySQLでは、ALTER TABLE文を実行してテーブルスキーマを変更できます。 テーブルのホットデータとコールドデータのテーブル名、列名、列データ型、通常インデックス、クラスタ化インデックス、外部キーインデックス、パーティション関数の形式、階層ストレージポリシーを変更できます。 このトピックでは、ALTER TABLEステートメントの使用方法について説明します。

構文

ALTER TABLE table_name
  { ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
  | ADD CLUSTERED [INDEX|KEY] [index_name] (column_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 FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
  | 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->'$[*]') 
  | 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
  | MODIFY [COLUMN] column_name column_definition
  | RENAME COLUMN column_name TO new_column_name
  | RENAME new_table_name
  | storage_policy
  | PARTITION BY VALUE(column_name|date_format(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ステートメントを使用して作成された顧客テーブルに基づいて提供されます。 顧客テーブルを作成した場合は、このトピックのサンプルステートメントを実行できます。 それ以外の場合は、次のサンプルステートメントを実行して顧客テーブルを作成します。

顧客テーブルを作成するためのサンプルステートメント

CREATE TABLE customer (
  customer_id BIGINT NOT NULL COMMENT 'Customer ID',
  customer_name VARCHAR NOT NULL COMMENT 'Customer name',
  phone_num BIGINT NOT NULL COMMENT 'Phone number',
  city_name VARCHAR NOT NULL COMMENT 'City',
  sex INT NOT NULL COMMENT 'Gender',
  id_number VARCHAR NOT NULL COMMENT 'ID card number',
  home_address VARCHAR NOT NULL COMMENT 'Home address',
  office_address VARCHAR NOT NULL COMMENT 'Office address',
  age INT NOT NULL COMMENT 'Age',
  login_time TIMESTAMP NOT NULL COMMENT 'Logon time',
  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 'Customer information table';                   

テーブル

テーブル名の変更

構文

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'

顧客テーブルのコメントを顧客テーブルに変更します。

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'],...)}

使用上の注意

主キー列は追加できません。

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

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

ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'VIP',tags VARCHAR DEFAULT 'None' COMMENT 'Tag');

列の削除

構文

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、SMALLINT、INT、およびBIGINTがあります。 値の範囲が狭いデータ型から値の範囲が広いデータ型に変更できます。 たとえば、列のデータ型をTINYINTからBIGINTに変更できますが、その逆はできません。

    • 浮動小数点データ型には、FLOATとDOUBLEがあります。 列のデータ型は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以降のAnalyticDB for MySQLクラスターのみが、整数データ型を浮動小数点データ型に変更し、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に変更できますが、NULLからnot 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'

顧客テーブルの [province] 列のコメントを、顧客がいる [province] に変更します。

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

インデックス

インデックスの作成

AnalyticDB for MySQLでテーブルを作成する場合、デフォルトでindex_all='Y' を使用してフルカラムインデックスが作成されます。 フルカラムインデックスが作成されていない場合は、次の方法を使用してインデックスを作成できます。

構文

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

Parameters

column_name: 列の名前。 上記のステートメントは、単純なデータ型の列にインデックスを作成するために使用されます。 JSON型の列にインデックスを作成するには、このトピックの「JSONインデックスの作成」をご参照ください。

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

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

JSONインデックスの作成

JSONインデックス

構文

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

Parameters

  • column_name: JSONインデックスを作成する列の名前。 列はJSON型でなければなりません。

  • column_name->'$.json_path': JSONインデックスを作成するJSONプロパティ。 column_nameパラメーターで指定する列は、JSON型である必要があります。 JSONインデックスの詳細については、「JSONインデックス」をご参照ください。

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

      AnalyticDB For MySQLクラスターのマイナーバージョンを表示する方法については、クラスターのマイナーバージョンを表示するにはどうすればよいですか。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

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

使用上の注意

作成されたJSONインデックスは、ビルドジョブの完了後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。 SHOW CREATE TABLE db_name.table_name; ステートメントを実行して、JSONインデックスが有効かどうかを照会できます。

重要

パーティション分割されたテーブルにJSONインデックスを作成する場合は、テーブル全体でBUILDステートメントを実行して、作成されたJSONインデックスを有効にする必要があります。

次のステートメントを使用して、テーブルスキーマを作成し、データを挿入します。

CREATE TABLE json_test(
  id INT,
  vj JSON
)
DISTRIBUTED BY HASH(id);

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->'$[*]')

Parameters

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

使用上の注意

作成されたJSON配列インデックスは、BUILDジョブの完了後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。

次のステートメントを使用して、テーブルスキーマを作成し、データを挿入します。

CREATE TABLE json_test(
  id INT,
  vj JSON
)
DISTRIBUTED BY HASH(id);

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

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

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

構文

ALTER TABLE db_name.table_name DROP KEY index_name

Parameters

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_name,...)

使用上の注意

  • すでにクラスタ化インデックスがあるテーブルのクラスタ化インデックスを作成することはできません。 テーブルには、クラスター化インデックスを1つだけ設定できます。

  • 作成されたクラスター化インデックスは、BUILDジョブの完了後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。 SHOW CREATE TABLE db_name.table_name; ステートメントを実行して、クラスター化インデックスが有効かどうかを照会できます。

customerテーブルのcustomer_id列にクラスター化インデックスを作成します。

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

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

構文

ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name

Parameters

index_name: 削除するクラスター化インデックスの名前。 SHOW CREATE TABLE db_name.table_nameステートメントを実行して、クラスター化インデックスの名前を照会できます。

customerテーブルからcustomer_id列のクラスタ化インデックスを削除します。

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

フルテキストインデックスの作成

前提条件

V3.1.4.9以降のAnalyticDB for MySQLクラスターが作成されます。

説明

構文

ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]

Parameters

  • column_name: フルテキストインデックスを作成する列の名前。 列はVARCHAR型でなければなりません。

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

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

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

使用上の注意

作成されたフルテキストインデックスは、ビルドジョブの完了後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。

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

Parameters

  • column_name: フルテキストインデックスを作成する列の名前。 列はVARCHAR型でなければなりません。

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

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

    • 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]

Parameters

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

  • column_name: ベクトル列の名前。 ベクトル列は、ARRAY <FLOAT>ARRAY <BYTE> 、またはARRAY <SMALLINT> タイプでなければなりません。

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

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

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

外部キーインデックスの作成

前提条件

V3.1.10以降AnalyticDB for MySQLクラスターのみがFOREIGN KEY句をサポートしています。

説明

AnalyticDB For MySQLのマイナーバージョンを表示する方法の詳細については、 Data Lakehouse Editionクラスターについては、「クラスターのマイナーバージョンを表示する方法」をご参照ください。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

構文

ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)

Parameters

  • db_name.table_name: 外部キーインデックスを作成するテーブルの名前。

  • symbol: 外部キー制約の名前。 名前はテーブル内で一意である必要があります。 このパラメーターはオプションです。 このパラメーターを指定しない場合、パーサーは外部キー制約の名前として_fkのサフィックスが付いた外部キー列の名前を自動的に使用します。

  • fk_column_name: 外部キー列の名前。 列はすでに存在している必要があります。

  • 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はデータ制約をチェックしません。 プライマリテーブルのプライマリキーと関連するテーブルの外部キーの間のデータ制約関係を確認する必要があります。

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

itemテーブルとstore_salesテーブルは、次のステートメントを実行して作成されます。

CREATE TABLE item
(
 i_item_sk BIGINT NOT NULL,
 i_current_price BIGINT,
 PRIMARY KEY(i_item_sk)
)
DISTRIBUTE 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;

パーティション

テーブルのパーティション関数形式の変更

前提条件

パーティション関数の形式を変更する前に、AnalyticDB for MySQLクラスターが次の要件を満たしていることを確認してください。

  • クラスターのマイナーバージョンは3.1.6以降です。

    説明

    AnalyticDB For MySQLのマイナーバージョンを表示する方法の詳細については、 Data Lakehouse Editionクラスターについては、「クラスターのマイナーバージョンを表示する方法」をご参照ください。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

  • Alibaba Cloudテクニカルサポートに問い合わせて、パーティション機能の形式を変更してください。

構文

ALTER TABLE table_name PARTITION BY VALUE(column_name|date_format(column_name,'format')) LIFECYCLE N 

使用上の注意

  • 非パーティションテーブルをパーティションテーブルに、またはパーティションテーブルを非パーティションテーブルに変更することはできません。 基本的に、パーティションキーを追加または削除することはできません。

  • 既存のパーティションキーに基づいてパーティションキーフィールドを追加、削除、または変更することはできません。

  • V3.2.1.1より前のAnalyticDB For MySQLクラスターでは、シャードレベルでパーティションライフサイクルを管理できます。この新しいパーティション関数形式は、BUILDジョブの完了後にのみ有効になります

  • テーブルレベルでパーティションライフサイクルを管理できるV3.2.1.1以降のAnalyticDB For MySQLクラスターの場合、パーティション関数の形式を変更した後、2つのBUILDジョブを実行する必要があります最初のBUILDジョブが完了すると、新しいパーティション関数の形式が有効になりますが、パーティションライフサイクルはシャードレベルで管理されます2番目のBUILDジョブが完了すると、テーブルレベルのパーティションのライフサイクル管理が有効になります

説明

自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。 SHOW CREATE TABLE db_name.table_name; ステートメントを実行して、新しいパーティション関数の形式が有効かどうかを照会できます。

  • customerテーブルのパーティション関数形式をpartition BY VALUE(date_format(login_time, '% Y % m % d')) LIFECYCLE 30からPARTITION BY VALUE(login_time) LIFECYCLE 10に変更します。

ALTER TABLE adb_demo.customer PARTITION BY VALUE(login_time) LIFECYCLE 10;
  • customerテーブルのパーティション関数形式をpartition BY VALUE(date_format(login_time, '% Y % m % d')) LIFECYCLE 30からPARTITION BY VALUE(date_format(login_time, ' % Y % m')) LIFECYCLE 30に変更します。

ALTER TABLE adb_demo.test PARTITION BY VALUE(date_format(login_time, '%Y%m')) LIFECYCLE 30;

テーブルのパーティションライフサイクルの変更

構文

ALTER TABLE db_name.table_name PARTITIONS N

使用上の注意

新しいパーティションライフサイクルは、BUILDジョブが完了した後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。 SHOW CREATE TABLE db_name.table_name; ステートメントを実行して、新しいパーティションのライフサイクルが有効になるかどうかを照会できます。

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

ALTER TABLE customer PARTITIONS 40;

ストレージポリシー

ホットデータとコールドデータの階層ストレージポリシーの変更

前提条件

のAnalyticDB for MySQL Data Lakehouse EditionクラスターまたはData Warehouse Editionクラスター elasticモードが作成されます。

構文

ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}

使用上の注意

新しい階層ストレージポリシーは、ビルドジョブが完了した後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。 SHOW CREATE TABLE db_name.table_name; ステートメントを実行して、新しいストレージポリシーが有効かどうかを照会できます。

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

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

    ALTER TABLE customer storage_policy = 'HOT';
  • customerテーブルのストレージポリシーをMIXEDに変更し、hot_partition_countパラメーターを使用して10個のホットパーティションを指定します。

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

よくある質問

テーブルの列の順序を変更できますか?

いいえ、テーブルの列の順序を変更することはできません。

列のデータ型をVARCHARからLONGTEXTに変更するにはどうすればよいですか?

AnalyticDB for MySQLは、VARCHAR型とBINARY型の文字列をサポートしています。 VARCHARタイプは、MySQLのCHARVARCHARTEXTMEDIUMTEXT、およびLONGTEXTタイプに対応します。 列のデータ型をVARCHARからLONGTEXTに変更する必要はありません。

データを含む既存のテーブルに自動インクリメント列を追加した後、システムは履歴データの列を自動的に設定しますか?

いいえ。 データを含む既存のテーブルに自動インクリメント列を追加すると、システムは自動的にその列に新しく挿入されたデータのみを入力します。 システムが履歴データの列を自動的に設定する場合は、自動インクリメント列を含むテーブルを作成し、既存のテーブルから新しいテーブルにデータを移行する必要があります。

テーブルの配布キーまたはパーティションキーを変更できますか?

いいえ。AnalyticDB for MySQLクラスターのテーブルの配布キーまたはパーティションキーを追加、削除、または変更することはできません。 テーブルに別の配布キーまたはパーティションキーを使用する場合は、次の手順を実行します。

この例では、注文テーブルの配布キーがorder_idからcustomer_idに変更されます。

  1. order_auto_opt_v1という名前の一時テーブルを作成し、配布キーをcustomer_idに設定します。

    CREATE TABLE order_auto_opt_v1 (
      order_id bigint NOT NULL COMMENT 'Order ID',
      customer_id bigint NOT NULL COMMENT 'Customer ID',
      customer_name varchar NOT NULL COMMENT 'Customer name',
      order_time timestamp NOT NULL COMMENT 'Order time',
      -- Other fields are omitted.
      PRIMARY KEY (order_id,customer_id,order_time) -- Add the distribution key customer_id and the partition key order_time to the primary key.
    )
    DISTRIBUTED BY HASH(customer_id) -- Change the distribution key from order_id to customer_id.
    PARTITION BY VALUE(DATE_FORMAT(order_time, '%Y%m%d')) LIFECYCLE 90 -- Retain the partition settings.
    COMMENT 'Order information table';
  2. INSERT OVERWRITE SELECTステートメントを実行して、ソーステーブルから一時テーブルにデータをインポートします。 詳細については、「INSERT OVERWRITE SELECT」をご参照ください。

    INSERT OVERWRITE order_auto_opt_v1
    SELECT * FROM order;
  3. データのインポート後、データスキューなど、新しい配布キーに関連する問題がないか確認します。 詳細については、「ストレージ診断」をご参照ください。

  4. RENAME TABLE <ソーステーブルの名前> to <New Name of the source table>; 文を実行して、ソーステーブルの名前を変更します。

    RENAME TABLE order to order_backup; -- After data is imported, rename the source table as a backup.
  5. RENAME TABLE <一時テーブルの名前> to <Name of the source table>; ステートメントを実行して、一時テーブルの名前をソーステーブルの名前に変更します。

    RENAME TABLE order_auto_opt_v1 to order;

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

  • 主キーを追加または削除することはできません。 主キーがないテーブルは、主キーがあるテーブルに変更することはできません。 主キーがあるテーブルは、主キーがないテーブルに変更することはできません。

  • 主キー列を追加または削除することはできません。

  • 主キー列の名前は変更できません。

  • 主キー列のデータ型は変更できません。

、テーブルのホットデータとコールドデータのパーティションライフサイクルまたは階層ストレージポリシーを変更しましたが、変更は有効になりませんでした。 これはなぜですか。

新しいパーティションライフサイクルまたは階層ストレージポリシーは、BUILDジョブが完了した後にのみ有効になります。 自動ビルドジョブ、手動ビルドジョブ、およびビルドジョブのステータスについては、「ビルド」をご参照ください。

SHOW CREATE TABLE db_name.table_name; ステートメントを実行して、新しいパーティションライフサイクルまたは階層ストレージポリシーが有効かどうかを照会できます。