ALTER TABLE 文を使用して、テーブルスキーマを変更できます。たとえば、カラムの追加、インデックスの作成、カラム定義の変更が可能です。この文は、AUTO モードのデータベースにのみ適用されます。
注意事項
インスタンスのバージョンが 5.4.17-16835173 より前の場合、ALTER TABLE 文ではシャードキーを変更することはできません。
構文
構文の詳細については、「MySQL ALTER TABLE」をご参照ください。
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
[local_partition_alter_options]
[例]
-
カラムの追加
user_logテーブルにidcardという名前のカラムを追加します。ALTER TABLE user_log ADD 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` TO `idcard_idx_new`; -
カラムの変更
user_logテーブルのidcardカラム (varcharカラム) の長さを 30 から 40 に変更します。ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
グローバルセカンダリインデックス
PolarDB-X は、グローバルセカンダリインデックス (GSI) をサポートしています。原理については、「グローバルセカンダリインデックス」をご参照ください。
カラムの変更
GSI があるテーブルの場合、カラム変更の構文は通常のテーブルと同じです。
GSI があるテーブルのカラムを変更する場合、追加の制限が適用されます。GSI の制限と規約の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。
インデックスの変更
構文
ALTER TABLE tbl_name
alter_specification # グローバルセカンダリインデックスに関連する変更では、alter_specification は 1 つしかサポートされません。
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name # グローバルセカンダリインデックスのインデックス名は明示的に指定する必要があります。
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [symbol]] 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 TO new_index_name
# グローバルセカンダリインデックスに固有の構文の詳細については、CREATE TABLE のドキュメントをご参照ください。
global_secondary_index_option:
[COVERING (col_name,...)] # カバリングインデックス
partition_options # index_sharding_col_name で指定されたカラムのみが含まれます。
# インデックス テーブルのシャーディング方法を指定します。
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)})
| LIST COLUMNS(column_list)} }
partition_list_spec
# パーティション関数の定義
partition_func:
YEAR
| TO_DAYS
| TO_SECOND
| UNIX_TIMESTAMP
| MONTH
# パーティションリストの定義
partition_list_spec:
hash_partition_list
| range_partition_list
| list_partition_list
# Hash/Key パーティションテーブルのカラム定義
hash_partition_list:
PARTITIONS partition_count
# Range/Range Columns パーティションテーブルのカラム定義
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]
# List/List Columns パーティションテーブルのカラム定義
list_partition_list:
list_partition [, list_partition ...]
list_partition:
PARTITION partition_name VALUES IN (value_list) [partition_spec_options]
partition_spec_options:
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
# 以下は MySQL DDL 構文です。
index_sharding_col_name:
col_name [(length)] [ASC | DESC]
index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
index_type:
USING {BTREE | HASH}
ALTER TABLE ADD GLOBAL INDEX 系の文は、既存のテーブルに GSI を追加します。これらの文では、標準の MySQL 構文の拡張である GLOBAL キーワードを使用し、インデックスが GSI であることを指定します。
また、ALTER TABLE { DROP | RENAME } INDEX 文を使用して GSI を変更することもできます。現在、既存のテーブルに GSI を追加する際には、いくつかの制限があります。GSI の制限と規約の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。
GSI 定義句の詳細については、「CREATE TABLE (AUTO モード)」をご参照ください。
例
-
テーブル作成後のグローバルセカンダリインデックスの追加
この例では、既存のテーブルに、GSI の一種であるグローバル一意インデックスを作成します。
# テーブルを作成します。 CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 partition by key(`order_id`) partitions 4; # グローバルセカンダリインデックスを作成します。 ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) partition by key(`buyer_id`) partitions 4;-
ベーステーブル:
t_orderテーブルは、order_idカラムをキーとしてシャーディングされています。 -
インデックス テーブル:
g_i_buyerインデックス テーブルは、buyer_idカラムをキーとしてシャーディングされています。order_snapshotカラムは、カバリングカラムとして指定されています。 -
インデックス定義句:
UNIQUE GLOBAL INDEX `g_i_buyer`(`buyer_id`) COVERING (order_snapshot) partition by key(`buyer_id`) partitions 4。
SHOW INDEXを実行して、ベーステーブルのインデックスを表示します。出力にはプライマリキーとローカルセカンダリインデックスl_i_orderが表示されますが、GSI は表示されません。GSI 自体は次のカラムで構成されています。buyer_idはインデックス テーブルのシャードキーです。id(ベーステーブルのプライマリキー) およびorder_id(ベーステーブルのシャードキー) は、デフォルトのカバリングカラムとして含まれています。order_snapshotは、明示的に指定されたカバリングカラムです。説明GSI の制限と規約の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。SHOW INDEX の詳細については、「SHOW INDEX」をご参照ください。
show index from t_order; +--------------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 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 rows in set (0.05 sec)SHOW GLOBAL INDEXを実行すると、GSI の情報のみを表示できます。詳細については、「SHOW GLOBAL INDEX」をご参照ください。show global index; +--------+---------+------------+-----------------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ | SCHEMA | TABLE | NON_UNIQUE | KEY_NAME | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT | STATUS | +--------+---------+------------+-----------------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ | d1 | t_order | 0 | g_i_buyer_$c1a0 | buyer_id | id, order_id, order_snapshot | NULL | | | NULL | | | NULL | PUBLIC | +--------+---------+------------+-----------------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ 1 row in set (0.04 sec)インデックス テーブルの構造を表示します。インデックス テーブルには、ベーステーブルのプライマリキーとシャードキー、デフォルトのカバリングカラム、およびカスタムのカバリングカラムが含まれます。プライマリキーカラムから AUTO_INCREMENT 属性が削除され、ベーステーブルのローカルセカンダリインデックスはインデックス テーブルに複製されません。デフォルトでは、グローバル一意制約を適用するために、インデックス テーブルのシャードキーに一意インデックスが自動的に作成されます。
show create table g_i_buyer; +-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TABLE | CREATE 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) DEFAULT NULL, `order_snapshot` longtext, UNIQUE KEY `auto_shard_key_buyer_id` USING BTREE (`buyer_id`), KEY `_gsi_pk_idx_` USING BTREE (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 PARTITION BY KEY(`buyer_id`) PARTITIONS 4 | +-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.10 sec) -
-
グローバルセカンダリインデックスの削除
g_i_sellerなどの GSI を削除すると、対応するインデックス テーブルも削除されます。# インデックスを削除します。 ALTER TABLE `t_order` DROP INDEX `g_i_seller`; -
インデックス名の変更
デフォルトでは、GSI の名前を変更することはできません。GSI の制限と規約の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。