ALTER TABLEステートメントを実行して、テーブルのスキーマを変更できます。 たとえば、列の追加、インデックスの作成、データ型の変更などができます。
注意
- ALTER TABLEステートメントを実行してシャードキーを変更することはできません。
- グローバルセカンダリインデックス (GSI) を含むテーブルでALTER TABLEステートメントを実行する必要がある場合は、MySQL 5.7以降とPolarDB-X 1.0. 5.4.1以降を使用します。
標準テーブルの変更
構文
ALTER [オンライン | オフライン] [IGNORE] 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インデックスidcard_idx; - 列の変更
user_logテーブルのidcard列の長さを30文字から40文字に変更します。 idcard列の値はVARCHAR型です。 次のサンプルコードを使用できます。
ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
GSIを含むテーブルの変更
列の変更
ALTER TABLEステートメントを実行して、GSIを含むテーブルの列を変更する場合、このステートメントの構文は、標準テーブルの列の変更に使用する構文と同じになります。 制限に精通していることをお勧めします。 制限の詳細については、「ALTER TABLEステートメントの実行に関する注意事項」をご参照ください。
インデックスの変更
構文
ALTER TABLE tbl_name
alter_specification# ALTER TABLEステートメントを実行して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 [シンボル]] 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から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を作成できます。 MySQLの構文と比較して、DRDSの構文ではGSIの作成を指定するGLOBALキーワードが導入されています。
ALTER TABLE { DROP | RENAME } INDEXを使用してGSIを変更することもできます。 テーブルの作成後にGSIを作成する場合は、制限に精通していることをお勧めします。 制限の詳細については、「GSIの使用に関する注意事項」をご参照ください。
GSIの定義に使用される句の詳細については、「CREATE TABLE」をご参照ください。
例
次の例は、テーブルの作成後に一意の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は、指定する対象の列です。
- GSIを定義するために使用される条項:
GLOBAL INDEX 'g_i_seller 'ON t_order ('seller_id') dbpartition by hash('seller_id')。
SHOW INDEXステートメントを実行して、インデックス情報を照会します。 たとえば、シャードキーorder_idのローカルインデックスと、buyer_id、id、order_id、およびorder_snapshotの列のGSIをクエリできます。 インデックステーブルの場合、buyer_id列はシャードキー、id列はプライマリキー、order_id列はシャードキーです。 id列とorder_id列はデフォルトのカバー列です。 order_snapshotは、明示的に指定するカバー列です。mysql> 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」をご参照ください。mysql> 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 | + --------------------- ------------------------------------------------- ------------------------------ --------------- + --------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- + -------------------- +------------ インデックステーブルのスキーマを表示します。 インデックステーブルには、プライマリテーブルのプライマリキー、データベースシャードキーとテーブルシャードキー、既定のカバーリング列、およびカスタムカバーリング列が含まれます。 AUTO_INCREMENT属性は主キーから削除されます。 ローカルインデックスがプライマリテーブルから削除されます。 デフォルトでは、GSIはインデックステーブルのすべてのシャードキーに作成され、各GSIはグローバルに一意です。
mysql> 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) デフォルトNULL、 'order_snapshot' ロングテキスト、 主要なキー ('id') 、 ユニークなキー 'auto_shard_key_buyer_id ' ('buyer_id') BTREEを使用 ) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('buyer_id') | + ----------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + - GSIを削除します。
g_i_sellerという名前のGSIを削除します。 この場合、g_i_sellerというインデックステーブルも削除されます。
ALTER TABLE 't_order' DROP INDEX 'g_i_seller '; - GSIの名前を変更します。
デフォルトでは、GSIの名前は変更できません。