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

PolarDB:ALTER TABLE (DRDS モード)

最終更新日:Aug 28, 2026

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