All Products
Search
Document Center

PolarDB:ALTER TABLE (AUTO mode)

Last Updated:Aug 28, 2026

Gunakan pernyataan ALTER TABLE untuk memodifikasi skema tabel, seperti menambahkan kolom, membuat indeks, atau mengubah definisi kolom. Pernyataan ini hanya berlaku untuk database dalam mode AUTO.

Catatan penggunaan

Jika versi instans Anda lebih lama dari 5.4.17-16835173, Anda tidak dapat menggunakan pernyataan ALTER TABLE untuk memodifikasi kunci shard.

Sintaksis

Catatan

Untuk sintaksis lengkap, lihat MySQL ALTER TABLE.

ALTER TABLE tbl_name
    [alter_specification [, alter_specification] ...]
  [partition_options]
  [local_partition_alter_options]

Example

  • Tambahkan kolom

    Tambahkan kolom bernama idcard ke tabel user_log:

    ALTER TABLE user_log
        ADD COLUMN idcard varchar(30);
  • Buat indeks

    Buat indeks bernama idcard_idx pada kolom idcard di tabel user_log:

    ALTER TABLE user_log
        ADD INDEX idcard_idx (idcard);
  • Hapus indeks

    Hapus indeks idcard_idx dari tabel user_log:

    ALTER TABLE user_log
        DROP INDEX idcard_idx;
  • Ubah nama indeks

    Ubah nama indeks idcard_idx menjadi idcard_idx_new pada tabel user_log:

    ALTER TABLE user_log
        RENAME INDEX `idcard_idx` TO `idcard_idx_new`;
  • Modifikasi kolom

    Ubah panjang kolom idcard (kolom varchar) dari 30 menjadi 40 pada tabel user_log:

    ALTER TABLE user_log
        MODIFY COLUMN idcard varchar(40);

Global secondary indexes

PolarDB-X mendukung global secondary index (GSI). Untuk memahami prinsip dasarnya, lihat Global Secondary Indexes.

Perubahan kolom

Untuk tabel yang memiliki GSI, sintaksis modifikasi kolom sama seperti pada tabel biasa.

Catatan

Saat memodifikasi kolom pada tabel dengan GSI, berlaku batasan tambahan. Untuk informasi selengkapnya tentang batasan dan konvensi terkait GSI, lihat Create and use global secondary indexes.

Perubahan indeks

Sintaksis

ALTER TABLE tbl_name
    alter_specification # Hanya satu alter_specification yang didukung untuk perubahan terkait global secondary indexes.

alter_specification:
  | ADD GLOBAL {INDEX|KEY} index_name # Anda harus secara eksplisit menentukan nama indeks untuk global secondary index.
      [index_type] (index_sharding_col_name,...)
      global_secondary_index_option
      [index_option] ...
  | ADD [CONSTRAINT [symbol]] UNIQUE GLOBAL
      [INDEX|KEY] index_name # Anda harus secara eksplisit menentukan nama indeks untuk global secondary index.
      [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

# Untuk informasi lebih lanjut tentang sintaksis khusus global secondary indexes, lihat dokumentasi CREATE TABLE.
global_secondary_index_option:
    [COVERING (col_name,...)] # Covering Index
    partition_options # Hanya mencakup kolom yang ditentukan dalam index_sharding_col_name.

# Tentukan metode sharding untuk tabel indeks.
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

# Definisi fungsi partisi
partition_func:
    YEAR
  | TO_DAYS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH

# Definisi daftar partisi
partition_list_spec:
    hash_partition_list
  | range_partition_list
  | list_partition_list

# Definisi kolom untuk tabel partisi Hash/Key
hash_partition_list:
    PARTITIONS partition_count

# Definisi kolom untuk tabel partisi Range/Range Columns
range_partition_list:
    range_partition [, range_partition ...]

range_partition:
    PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]

# Definisi kolom untuk tabel partisi 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' ]

# Berikut adalah sintaksis DDL MySQL.
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}

Keluarga pernyataan ALTER TABLE ADD GLOBAL INDEX menambahkan GSI ke tabel yang sudah ada. Pernyataan ini menggunakan kata kunci GLOBAL—sebagai ekstensi dari sintaksis MySQL standar—untuk menentukan bahwa indeks tersebut merupakan GSI.

Anda juga dapat menggunakan pernyataan ALTER TABLE { DROP | RENAME } INDEX untuk memodifikasi GSI. Saat ini, beberapa batasan berlaku saat menambahkan GSI ke tabel yang sudah ada. Untuk informasi selengkapnya tentang batasan dan konvensi terkait GSI, lihat Create and use global secondary indexes.

Untuk informasi lebih lanjut tentang klausa definisi GSI, lihat CREATE TABLE (DRDS mode).

Contoh

  • Tambahkan global secondary index setelah pembuatan tabel

    Contoh ini membuat indeks unik global, yaitu jenis GSI, pada tabel yang sudah ada.

    # Buat tabel.
    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;
    
    # Buat global secondary index.
    ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) partition by key(`buyer_id`) partitions 4;
    • Tabel dasar: Tabel t_order di-shard berdasarkan kunci pada kolom order_id.

    • Tabel indeks: Tabel indeks g_i_buyer di-shard berdasarkan kunci pada kolom buyer_id. Kolom order_snapshot ditentukan sebagai kolom covering.

    • Klausa definisi indeks: UNIQUE GLOBAL INDEX `g_i_buyer`(`buyer_id`) COVERING (order_snapshot) partition by key(`buyer_id`) partitions 4.

    Jalankan SHOW INDEX untuk melihat indeks pada tabel dasar. Output menampilkan kunci PRIMARY dan indeks sekunder lokal l_i_order, tetapi tidak menampilkan GSI. GSI itu sendiri terdiri dari kolom-kolom berikut: buyer_id adalah kunci shard dari tabel indeks; id (kunci primer tabel dasar) dan order_id (kunci shard tabel dasar) disertakan sebagai kolom covering default; dan order_snapshot adalah kolom covering yang ditentukan secara eksplisit.

    Catatan

    Untuk informasi selengkapnya tentang batasan dan konvensi terkait GSI, lihat Create and use global secondary indexes. Untuk informasi lebih lanjut tentang SHOW INDEX, lihat 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)

    Anda dapat menjalankan SHOW GLOBAL INDEX untuk melihat hanya informasi GSI. Untuk informasi lebih lanjut, lihat 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)
                            

    Lihat struktur tabel indeks. Tabel indeks berisi kunci primer dan kunci shard dari tabel dasar, kolom covering default, serta kolom covering kustom. Atribut AUTO_INCREMENT dihapus dari kolom kunci primer, dan indeks sekunder lokal dari tabel dasar tidak direplikasi pada tabel indeks. Secara default, untuk menerapkan batasan unik global, indeks unik dibuat secara otomatis pada kunci shard tabel indeks.

    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)
  • Hapus global secondary index

    Saat Anda menghapus GSI, seperti g_i_seller, tabel indeks yang sesuai juga akan dihapus.

    # Hapus indeks.
    ALTER TABLE `t_order` DROP INDEX `g_i_seller`;
  • Ubah nama indeks

    Secara default, Anda tidak dapat mengubah nama GSI. Untuk informasi selengkapnya tentang batasan dan konvensi terkait GSI, lihat Use global secondary indexes.