ALTER TABLE 文を使用して、列やインデックスの追加、データ定義の変更など、テーブル構造を変更します。この文は、DRDS モードのデータベースにのみ適用されます。
注意事項
ALTER TABLE 文を使用してシャードキーを変更することはできません。
構文
詳細な構文については、MySQL ALTER TABLE 文をご参照ください。
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_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インデックスをidcard_idx_newに名前変更します。ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`; -
ローカルインデックスの削除
user_logテーブルからidcard_idxインデックスを削除します。ALTER TABLE user_log DROP INDEX idcard_idx; -
列の変更
user_logテーブルのidcard列 (varchar) の長さを 30 から 40 に変更します。ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
グローバルセカンダリインデックス
PolarDB-X はグローバルセカンダリインデックス (GSI) をサポートしています。基本原理については、「グローバルセカンダリインデックス」をご参照ください。
列の変更
GSI を使用するテーブルの場合、列を変更する構文は通常のテーブルと同じです。
グローバルセカンダリインデックスを含むテーブルを変更する場合、列の変更には追加の制限があります。GSI の制限と規則の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。
インデックスの変更
構文
ALTER TABLE tbl_name
alter_specification # GSI 関連の変更の場合、alter_specification は 1 つのみサポートされています。
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name # GSI 名を明示的に指定する必要があります。
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE GLOBAL
[INDEX|KEY] index_name # GSI 名を明示的に指定する必要があります。
[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
global_secondary_index_option:
[COVERING (col_name,...)] # カバリングインデックス
drds_partition_options # index_sharding_col_name で指定された列のみを含める必要があります。
# インデックステーブルのシャーディング方法を指定します。
drds_partition_options:
DBPARTITION BY db_sharding_algorithm
[TBPARTITION BY {table_sharding_algorithm} [TBPARTITIONS num]]
db_sharding_algorithm:
HASH([col_name])
| {YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
| UNI_HASH(col_name)
| RIGHT_SHIFT(col_name, n)
| RANGE_HASH(col_name, col_name, n)
table_sharding_algorithm:
HASH(col_name)
| {MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
| UNI_HASH(col_name)
| RIGHT_SHIFT(col_name, n)
| RANGE_HASH(col_name, col_name, n)
# 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 を追加します。この文は、GLOBAL キーワードを導入することで MySQL 構文を拡張し、追加するインデックスが GSI であることを指定します。
ALTER TABLE { DROP | RENAME } INDEX 構文を使用して GSI を変更することもできます。これらの操作には特定の制限があります。GSI の制限と規則の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。
GSI 定義句の詳細については、「CREATE TABLE (DRDS モード)」をご参照ください。
例
-
グローバルセカンダリインデックスの作成
この例では、既存のテーブルに一意の 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 dbpartition by hash(`order_id`); # グローバルセカンダリインデックスを作成 ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`);-
ベーステーブル:
t_orderはデータベースシャーディングのみ (テーブルシャーディングなし) で分割されています。データベースシャーディング方法はorder_id列のハッシュです。 -
インデックステーブル:
g_i_buyerはデータベースシャーディングのみ (テーブルシャーディングなし) で分割されています。データベースシャーディング方法はbuyer_id列のハッシュで、カバリング列はorder_snapshotです。 -
インデックス定義句:
ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`)
SHOW INDEXを使用してインデックス情報を表示します。結果には、シャードキーorder_idのローカルインデックスと、buyer_idをインデックスキーとし、複数のカバリング列を含む 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 | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | | t_order | 1 | l_i_order | 1 | order_id | A | 0 | NULL | NULL | YES | BTREE | | | | t_order | 0 | g_i_buyer | 1 | buyer_id | NULL | 0 | NULL | NULL | YES | GLOBAL | INDEX | | | t_order | 1 | g_i_buyer | 2 | id | NULL | 0 | NULL | NULL | | GLOBAL | COVERING | | | t_order | 1 | g_i_buyer | 3 | order_id | NULL | 0 | NULL | NULL | YES | GLOBAL | COVERING | | | t_order | 1 | g_i_buyer | 4 | order_snapshot | NULL | 0 | NULL | NULL | YES | GLOBAL | COVERING | | +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+SHOW GLOBAL INDEXを使用すると、GSI 情報のみを表示できます。詳細については、「SHOW GLOBAL INDEX」をご参照ください。show global index from t_order;次の出力が返されます。
+---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ | 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 | +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ | ZZY3_DRDS_LOCAL_APP | t_order | 0 | g_i_buyer | buyer_id | id, order_id, order_snapshot | NULL | buyer_id | HASH | 4 | | NULL | NULL | PUBLIC | +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+インデックステーブルの構造を表示します。インデックステーブルには、ベーステーブルのプライマリキーとシャードキー、デフォルトのカバリング列と、明示的に指定されたカバリング列の両方が含まれます。プライマリキー列から
AUTO_INCREMENT属性が削除され、ベーステーブルのローカルインデックスは除外されます。グローバル一意性制約を適用するために、インデックステーブルのシャードキーに一意のインデックスがデフォルトで作成されます。show create table g_i_buyer;次の出力が返されます。
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | g_i_buyer | CREATE TABLE `g_i_buyer` (`id` bigint(11) NOT NULL, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, PRIMARY KEY (`id`), UNIQUE KEY `auto_shard_key_buyer_id` (`buyer_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`buyer_id`) | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -
-
グローバルセカンダリインデックスの削除
g_i_buyerという名前の GSI を削除します。対応するインデックステーブルも削除されます。# インデックスを削除 ALTER TABLE `t_order` DROP INDEX `g_i_buyer`; -
インデックスの名前変更
デフォルトでは、GSI の名前変更は制限されています。GSI の制限と規則の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。