ALTER TABLEステートメントを使用して、テーブルのスキーマを変更できます。 たとえば、列を追加したり、インデックスを追加したり、列のデータ型やその他の属性を変更したりできます。 このトピックで説明する構文は、分散リレーショナルデータベースサービス (DRDS) モードのデータベースにのみ適用されます。
使用上の注意
ALTER TABLEステートメントを使用して、テーブルのシャードキーを変更することはできません。
構文
ALTER TABLEステートメントを使用して、列を追加したり、インデックスを作成したり、列のデータ型やその他の属性を変更したりできます。 構文の詳細については、「MySQL ALTER TABLEステートメント」をご参照ください。
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_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インデックスをidcard_idx_newに名前を変更します。
ALTER TABLE user_log RENAME INDEX 'idcard_idx' を 'idcard_idx_new ';
ローカルインデックスの削除
次の文を実行して、user_logテーブルからidcard_idxインデックスを削除します。
ALTER TABLE user_log DROP INDEX idcard_idx;
列の変更
次のステートメントを実行して、user_logテーブルのVARCHARデータ型を使用するidcard列の最大長を30文字から40文字に変更します。
ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
GSI
PolarDB-Xはグローバルセカンダリインデックス (GSI) をサポートしています。 GSIの詳細については、「GSI」をご参照ください。
列の変更
GSIを持つテーブルの場合、列を変更する構文は、GSIを持たないテーブルの構文と同じです。
GSIを持つテーブルの列を変更するときは、制限に注意してください。 GSIの制限と規則については、「グローバルセカンダリインデックスの使用方法」をご参照ください。
インデックスの変更
構文
ALTER TABLE tbl_name
alter_specification# ALTER TABLEステートメントを使用してグローバルセカンダリインデックスを変更する場合、alter_specificationオプションは1回だけ使用できます。
alter_specification:
| ADD GLOBAL {INDEX | KEY} index_name# GSIを追加するには、GSIの名前を明示的に指定する必要があります。
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [シンボル]] UNIQUE GLOBAL
[INDEX | KEY] index_name# GSIを追加するには、GSIの名前を明示的に指定する必要があります。
[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へ
global_secondary_index_option:
[COVERING (col_name,...)] # カバーインデックス
drds_partition_options# index_sharding_col_nameにリストされている1つ以上の列を指定します。
# シャーディング方法を指定します。
drds_partition_options:
db_sharding_algorithmによるDBPARTITION
[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 | YYYYYYWEEK | YYYYMM_OPT | YYYYYYWEEK_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 [=] 値
| index_type
| PARSER parser_name付き
| コメント '文字列'
index_type:
USING {BTREE | ハッシュ}
ALTER TABLE ADD GLOBAL INDEX
構文は、既存のテーブルにGSIを追加するために使用されます。 構文は、追加されたインデックスがGSIであることを指定するために、GLOBALキーワードをMySQL構文に導入します。
ALTER TABLE { DROP | RENAME } INDEX
構文を使用して、GSIを削除または名前変更できます。 既存のテーブルにGSIを追加するときは、制限に注意してください。 GSIの制限と規則の詳細については、「グローバルセカンダリインデックスの使用方法」をご参照ください。
GSIの作成に使用できる句については、「create TABLE (DRDSモード) 」をご参照ください。
例
既存のテーブルにGSIを作成する
次の例は、既存のテーブルにGSIを作成する方法を示しています。
# テーブルを作成します。 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') ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('order_id'); # GSIを作成します。 ALTER TABLE t_order ADD UNIQUEグローバルインデックス 'g_i_buyer ' ('buyer_id') カバー ('order_snapshot') dbpartition by hash('buyer_id');
t_orderはベーステーブルです。 ベーステーブルは、order_id列のハッシュ値に基づいて複数のデータベースシャードに分散されます。
g_i_buyerはインデックステーブルです。 インデックステーブルは、buyer_id列のハッシュ値に基づいて複数のデータベースシャードに分散されます。 order_snapshot列はカバー列として指定されます。
GLOBAL INDEX 'g_i_seller 'ON t_order ('seller_id') dbpartition by hash('seller_id')
句は、GSIを定義する。
SHOW INDEX
ステートメントを使用して、テーブルのインデックスを照会できます。 この例では、t_orderテーブルのインデックスには、シャードキー列order_idのローカルインデックスと、buyer_id、id、order_id、およびorder_snapshot列のGSIが含まれます。 buyer_idはインデックステーブルのシャードキー、id (プライマリキー) とorder_id (インデックステーブルのシャードキー) はデフォルトのカバー列、order_snapshotは明示的に指定されたカバー列です。説明GSIの制限と規則については、「グローバルセカンダリインデックスの使用方法」をご参照ください。 SHOW INDEXステートメントの詳細については、「SHOW INDEX」をご参照ください。
show index from t_order;
次の情報が返されます。
+ --------------------------------------------------------------------------------------------- | テーブル | 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 | グローバル | インデックス | | | t_order | 1 | g_i_buyer | 2 | id | NULL | 0 | NULL | NULL | | グローバル | カバー | | | t_order | 1 | g_i_buyer | 3 | order_id | NULL | 0 | NULL | NULL | YES | グローバル | カバー | | | t_order | 1 | g_i_buyer | 4 | order_snapshot | NULL | 0 | NULL | NULL | YES | グローバル | カバー | | ---------------- -----------------------------------------------------------------------------------------------------------------
SHOW GLOBAL INDEX
ステートメントを実行して、GSIに関する情報を照会できます。 詳細については、「SHOW GLOBAL INDEX」をご参照ください。show global index from t_order;
次の情報が返されます。
--------------------- --------- ---------------------------------------------------- ------------------------------ + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +--------------- | スキーマ | テーブル | 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 + --------------------- ------------------------------------------------- ------------------------------ --------------- + | 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 | + --------------------- ------------------------------------------------- ------------------------------ --------------- + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +-----------
次のステートメントを使用して、インデックステーブルのスキーマを照会できます。 次の例では、g_i_buyerインデックステーブルに、ベーステーブルの主キー、データベースシャードキーとテーブルシャードキー、既定のカバーリング列、およびカスタムカバーリング列が含まれます。 インデックステーブルの主キーにはAUTO_INCREMENT属性がなく、ベーステーブルのローカルインデックスが削除されます。 グローバル一意の制約を確保するために、すべてのシャードキーにグローバル一意のインデックスが作成されます。
show create table g_i_buyer;
次の情報が返されます。
+ ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + | テーブル | テーブルの作成 | + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + | 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' buyer, 'db_buy' ('REut_hash) 8), UNIQUE 'SESET'_h_SET' ('inSET 'InnoYキー', ', 'in') + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
GSIの削除
g_i_sellerという名前のGSIを削除します。 対応するインデックステーブルも削除されます。
# g_i_sellerという名前のGSIを削除します。 ALTER TABLE 't_order' DROP INDEX 'g_i_seller ';
GSIの名前変更
デフォルトでは、GSIの名前は変更できません。 GSIの制限と規則については、「グローバルセカンダリインデックスの使用方法」をご参照ください。