すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ALTER TABLE (AUTO モード)

最終更新日:Aug 28, 2026

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 の制限と規約の詳細については、「グローバルセカンダリインデックスの作成と使用」をご参照ください。