ALTER TABLE 文を実行して、テーブルのスキーマを変更できます。たとえば、列の追加、インデックスの追加、データ型の変更などを行うことができます。この構文は、AUTO モードのデータベースにのみ適用されます。
使用上の注意
バージョンが 5.4.17-16835173 より前のインスタンスでは、ALTER TABLE 文を実行してシャードキーを変更することはできません。
構文
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 列の長さを 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 TABLE 文で 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 に含まれる 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)})
| 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_partition_list:
PARTITIONS partition_count
# 範囲パーティション分割または範囲列パーティション分割でデータをパーティション分割する範囲を指定します。
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name VALUES LESS THAN {(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:
[[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 を実行して、グローバルセカンダリインデックスを作成できます。 MySQL 構文と比較して、ALTER TABLE ADD GLOBAL INDEX 構文では GLOBAL キーワードが導入されています。このキーワードは、追加するインデックスがグローバルセカンダリインデックスであることを指定します。
ALTER TABLE { DROP | RENAME } INDEX を実行して、グローバルセカンダリインデックスを変更することもできます。ただし、この構文では、テーブルを作成した後にグローバルセカンダリインデックスを追加することに制限があります。 グローバルセカンダリインデックスの制限と規則の詳細については、「グローバルセカンダリインデックスの使い方」をご参照ください。
グローバルセカンダリインデックスの定義に使用される句の詳細については、「CREATE TABLE (DRDS モード)」をご参照ください。
例
[テーブルの作成後にグローバルセカンダリインデックスを追加する]
次の例は、テーブルを作成してからグローバルセカンダリインデックスを追加する方法を示しています。
# テーブルを作成します。 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 という名前のインデックステーブルが作成されます。データは、ハッシュアルゴリズムを使用してシャーディングされます。 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」をご参照ください。
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文を実行して、グローバルセカンダリインデックスのみをクエリできます。詳細については、「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 という名前のグローバルセカンダリインデックスを削除します。対応するインデックステーブルも削除されます。
# インデックスを削除します。 ALTER TABLE `t_order` DROP INDEX `g_i_seller`;[インデックスの名前を変更する]
デフォルトでは、グローバルセカンダリインデックスの名前を変更することはできません。グローバルセカンダリインデックスの制限と規則の詳細については、「グローバルセカンダリインデックスの使い方」をご参照ください。