ALTER TABLEステートメントを実行して、テーブルのスキーマを変更できます。 たとえば、列の追加、インデックスの追加、データ型の変更ができます。 この構文は、AUTOモードのデータベースにのみ適用されます。
使用上の注意
ALTER TABLEステートメントを実行してシャードキーを変更することはできません。
構文
ALTER TABLEステートメントは、テーブルのスキーマを変更するために実行されます。 たとえば、列の追加、インデックスの追加、データ型の変更ができます。 構文の詳細については、「MySQL ALTER TABLE」をご参照ください。
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
[local_partition_alter_options]
例
列の追加
次の例は、idcardという名前の列をuser_logテーブルに追加する方法を示しています。
ALTER TABLE user_log COLUMN idcard varcharを追加 (30);
インデックスの作成
次の例は、user_logテーブルのidcard列にidcard_idxという名前のインデックスを作成する方法を示しています。
ALTER TABLE user_log ADD INDEX idcard_idx (idcard);
インデックスの削除
次の例は、user_logテーブルからidcard_idxインデックスを削除する方法を示しています。
ALTER TABLE user_log DROP INDEX idcard_idx;
インデックスの名前変更
次の例は、user_logテーブルでidcard_idxインデックスの名前をidcard_idx_newに変更する方法を示しています。
ALTER TABLE user_log RENAME INDEX 'idcard_idx' を 'idcard_idx_new ';
列の変更
次の例は、user_logテーブルのidcard列の長さを30文字から40文字に変更する方法を示しています。 idcard列のデータ型はVARCHARです。
ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
グローバルセカンダリインデックス
PolarDB-Xはグローバルセカンダリインデックスをサポートしています。 詳細については、「GSI」をご参照ください。
列の変更
グローバルセカンダリインデックスを使用するテーブルの列は、通常のテーブルの変更と同じ方法で変更できます。
ただし、PolarDB-Xには、グローバルセカンダリインデックスを使用するテーブルの列の変更に制限があります。 グローバルセカンダリインデックスの制限と規則の詳細については、「グローバルセカンダリインデックスの使用方法」をご参照ください。
インデックスの変更
構文
ALTER TABLE tbl_name
alter_specification# alter_specificationオプションは、グローバルセカンダリインデックスを変更するときに、各ALTER TABLEステートメントで1回だけ使用します。
alter_specification:
| ADD GLOBAL {INDEX | KEY} index_name# グローバルセカンダリインデックスの名前を明示的に指定します。
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [シンボル]] UNIQUE GLOBAL
[INDEX | KEY] index_name# グローバルセカンダリインデックスの名前を明示的に指定します。
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| DROP {INDEX | KEY} index_name
| RENAME {INDEX | KEY} old_index_nameからnew_index_nameへ
# 構文はグローバルセカンダリインデックスにのみ適用されます。 詳細については、CREATE TABLEステートメントのドキュメントを参照してください。
global_secondary_index_option:
[COVERING (col_name,...)] # カバーインデックス
partition_options# index_sharding_col_nameに含まれる1つ以上の列を指定します。
# インデックステーブルのシャーディング方法を指定します。
partition_options:
PARTITION BY
HASH({column_name | partition_func(column_name)})
| KEY(column_list)
| RANGE{({column_name | partition_func(column_name)})
| RANGE COLUMNS(column_list)}
| LIST{({column_name | partition_func(column_name)})
| リストコラム (column_list)} }
partition_list_spec
# パーティション関数を指定します。
partition_func:
YEAR
| TO_DAYS
| TO_SECOND
| UNIX_TIMESTAMP
| 月
# パーティションリストのタイプを指定します。
partition_list_spec:
hash_partition_list
| range_partition_list
| list_partition_list
# ハッシュ分割またはキー分割によって生成するパーティションの数を指定します。
hash_partition_list:
パーティションpartition_count
# 範囲分割または範囲列分割でデータを分割する範囲を指定します。
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name値 {(expr | value_list)} [partition_spec_options]
# リスト分割またはリスト列分割でデータを分割するリストを指定します。
list_partition_list:
list_partition [, list_partition ...]
list_partition:
PARTITION partition_name VALUES IN (value_list) [partition_spec_options]
partition_spec_options:
[[ストレージ] エンジン [=] engine_name]
[COMMENT [=] 'string']
# MySQL DDL構文は、次の例で使用されます。index_sharding_col_name:
col_name [(length)] [ASC | DESC]
index_option:
KEY_BLOCK_SIZE [=] 値
| index_type
| PARSER parser_name付き
| コメント '文字列'
index_type:
USING {BTREE | ハッシュ}
テーブルを作成したら、ALTER table ADD GLOBAL INDEX
を実行してグローバルセカンダリインデックスを作成できます。 MySQL構文と比較して、ALTER TABLE ADD GLOBAL INDEX構文はGLOBALキーワードを導入します。 このキーワードは、追加するインデックスがグローバルセカンダリインデックスであることを指定します。
ALTER TABLE { DROP | RENAME } INDEX
を実行して、グローバルセカンダリインデックスを変更することもできます。 ただし、テーブルの作成後にグローバルセカンダリインデックスを追加するには、構文に制限があります。 グローバルセカンダリインデックスの制限と規則の詳細については、「」をご参照ください。グローバルセカンダリインデックスの使用方法.
グローバルセカンダリインデックスの定義に使用される句の詳細については、「CREATE TABLE ( DRDSモード) 」をご参照ください。
例
テーブルの作成後にグローバルセカンダリインデックスを追加する
次の例は、テーブルを作成してからグローバルセカンダリインデックスを追加する方法を示しています。
# テーブルを作成します。 CREATE TAB_order ( 'id' bigint(11) NOT NULL AUTO_INCREMENT、 'order_id' varchar(20) DEFAULT NULL、 'buyer_id 'varchar(20) デフォルトNULL、 'seller_id 'varchar(20) DEFAULT NULL、 'order_snapshot' ロングテキストDEFAULT NULL、 'order_detail' ロングテキストDEFAULT NULL、 主要なキー ('id') 、 KEY 'L_i_order ' ('order_id') ) エンジン=InnoDBデフォルト料金=utf8 キーによるパーティション ('order_id') パーティション4; # グローバルセカンダリインデックスを追加します。 ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX 'g_i_buyer ' ('buyer_id') COVERING ('order_snapshot') キーによるパーティション ('buyer_id') パーティション4;
ベーステーブル: 上記の例では、t_orderという名前のテーブルが各データベースシャードに作成されます。 データは、ハッシュアルゴリズムを使用してシャードされる。 order_id列は、ハッシュされたシャードキーとして指定されます。
インデックステーブル: 上記の例では、g_i_buyerという名前のインデックステーブルが各データベースシャードに作成されます。 データは、ハッシュアルゴリズムを使用してシャードされる。 order_id列は、ハッシュされたシャードキーとして指定されます。 order_snapshot列はカバー列として指定されます。
グローバルセカンダリインデックスを定義するために使用される条項:
UNIQUE global index 'g_i_buyer '('buyer_id') COVERING (order_snapshot) partition by key('buyer_id') partitions 4
。
SHOW INDEX
ステートメントを実行して、インデックス情報を照会します。 インデックス情報には、order_idシャードキーのローカルセカンダリインデックスと、buyer_id、id、order_id、およびorder_snapshot列のグローバルセカンダリインデックスが含まれます。 buyer_id列は、インデックステーブルのシャードキーです。 id列は、ベーステーブルの主キーです。 order_id列は、ベーステーブルのシャードキーです。 id列とorder_id列はデフォルトのカバー列です。 order_snapshotは、明示的に指定するカバー列です。説明グローバルセカンダリインデックスの使用に関する制限と注意事項の詳細については、「グローバルセカンダリインデックスの使用方法」をご参照ください。 SHOW INDEXステートメントの詳細については、「SHOW INDEX」をご参照ください。
はt_orderからインデックスを表示します。----------- ------------------------------------------------------------------------------------------------------------------ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | カーディナリティ | Sub_part | パック | Null | Index_type | コメント | Index_comment | ----------- ------------------------------------------------------------------------------------------------------------------ | t_order_syes_00000 | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | t_order_syes_00000 | 1 | l_i_order | 1 | order_id | A | 0 | NULL | NULL | YES | BTREE | | ----------- ------------------------------------------------------------------------------------------------------------------ セットの2列 (0.05秒)
SHOW GLOBAL INDEX
ステートメントを実行して、グローバルなセカンダリインデックスのみを照会できます。 詳細については、「SHOW GLOBAL INDEX」をご参照ください。ショーグローバルインデックス。-------- --------- ------------ ----------------- ---------------------------------- ------------------ + --------------------- + --------------------- + ------------------ + ------------------ + ------------------ + ------------------ + -------------------- + -------------------- + -------------------------------- | スキーマ | テーブル | NON_UNIQUE | KEY_NAME | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_POLICY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_COUNTIUS -------- --------- ----------- ----------------- ----------------------------------- ------------------ + --------------------- + --------------------- + -------------------- + ------------------ + --------------------- + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- +----------- | d1 | t_order | 0 | g_i_buyer_$c1a0 | buyer_id | id, order_id, order_snapshot | NULL | | | NULL | | NULL | | PUBLIC | -------- --------- ------------ ----------------- ---------------------------------- ------------------ + --------------------- + --------------------- + ------------------ + ------------------ + ------------------ + ------------------ + -------------------- + -------------------- + -------------------------------- セットの1列 (0.04秒)
次のサンプルコードを使用して、インデックステーブルのスキーマを表示できます。 インデックステーブルには、ベーステーブルの主キー、データベースシャードキーとテーブルシャードキー、既定のカバーリング列、およびカスタムカバーリング列が含まれます。 主キー列からAUTO_INCREMENT属性が削除されます。 ベーステーブルのローカルインデックスも削除されます。 デフォルトでは、インデックステーブルのすべてのシャードキーにグローバル一意のインデックスが作成されます。 インデックスは、ベーステーブルのグローバルに一意の制約として使用されます。
show create table g_i_buyer; + ----------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + | TABLE | テーブルの作成 | + ----------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + | g_i_buyer_$c1a0 | CREATE TABLE 'g_i_buyer_$c1a0' ( 'id' bigint(11) NOT NULL、 'order_id' varchar(20) DEFAULT NULL、 'buyer_id 'varchar(20) デフォルトNULL、 'order_snapshot' ロングテキスト、 UNIQUE KEY 'auto_shard_key_buyer_id 'USING BTREE ('buyer_id') 、 KEY '_gsi_pk_idx_' 使用するBTREE ('id') ) エンジン=InnoDBデフォルト料金=utf8 キーによるパーティー ('buyer_id ') パーティー4 | + ----------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1行セット (0.10秒)
グローバルセカンダリインデックスの削除
g_i_sellerという名前のグローバルセカンダリインデックスを削除します。 対応するインデックステーブルも削除されます。
# インデックスを削除します。 ALTER TABLE 't_order' DROP INDEX 'g_i_seller ';
インデックスの名前変更
デフォルトでは、グローバルセカンダリインデックスの名前は変更できません。 グローバルセカンダリインデックスの制限と規則の詳細については、「グローバルセカンダリインデックスの使用方法」をご参照ください。