全部产品
Search
文档中心

PolarDB:ALTER TABLE (Mode AUTO)

更新时间:Jul 03, 2025

Pernyataan ALTER TABLE digunakan untuk memodifikasi skema tabel, seperti menambahkan kolom, menambahkan indeks, atau mengubah tipe data. Sintaks ini hanya berlaku untuk database mode AUTO.

Catatan Penggunaan

Untuk instance dengan versi lebih lama dari 5.4.17-16835173, pernyataan ALTER TABLE tidak dapat digunakan untuk mengubah kunci shard.

Sintaks

Catatan

Pernyataan ALTER TABLE digunakan untuk memodifikasi skema tabel, seperti menambahkan kolom, menambahkan indeks, atau mengubah tipe data. Untuk detail lebih lanjut tentang sintaks, lihat MySQL ALTER TABLE.

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

Example

  • Tambahkan kolom

    Contoh berikut menunjukkan cara menambahkan kolom bernama idcard ke tabel user_log:

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

    Contoh berikut menunjukkan cara membuat indeks bernama idcard_idx pada kolom idcard di tabel user_log:

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

    Contoh berikut menunjukkan cara menghapus indeks idcard_idx dari tabel user_log:

    ALTER TABLE user_log
        DROP INDEX idcard_idx;
  • Ganti nama indeks

    Contoh berikut menunjukkan cara mengganti nama indeks idcard_idx menjadi idcard_idx_new di tabel user_log:

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

    Contoh berikut menunjukkan cara mengubah panjang kolom idcard di tabel user_log dari 30 karakter menjadi 40 karakter. Tipe data kolom idcard adalah VARCHAR.

    ALTER TABLE user_log
        MODIFY COLUMN idcard varchar(40);

Indeks Sekunder Global

PolarDB-X mendukung indeks sekunder global. Untuk informasi lebih lanjut, lihat GSI.

Modify a column

Anda dapat memodifikasi kolom dalam tabel yang menggunakan indeks sekunder global dengan cara yang sama seperti memodifikasi tabel biasa.

Catatan

Namun, PolarDB-X memiliki batasan pada modifikasi kolom dalam tabel yang menggunakan indeks sekunder global. Untuk detail lebih lanjut tentang batasan dan konvensi indeks sekunder global, lihat Buat dan gunakan GSIs.

Modify an index

Sintaks

ALTER TABLE tbl_name
    alter_specification # Gunakan opsi alter_specification hanya satu kali dalam setiap pernyataan ALTER TABLE saat Anda memodifikasi indeks sekunder global.

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

# Sintaks ini hanya berlaku untuk indeks sekunder global. Untuk informasi lebih lanjut, lihat dokumentasi pernyataan CREATE TABLE.
global_secondary_index_option:
    [COVERING (col_name,...)] # Covering Index
    partition_options # Tentukan satu atau lebih kolom yang terkandung 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

# Tentukan fungsi partisi.
partition_func:
    YEAR
  | TO_DAYS
  | TO_SECOND
  | UNIX_TIMESTAMP
  | MONTH

# Tentukan jenis daftar partisi.
partition_list_spec:
    hash_partition_list
  | range_partition_list
  | list_partition_list

# Tentukan jumlah partisi yang ingin Anda hasilkan melalui partisi hash atau partisi key.
hash_partition_list:
    PARTITIONS partition_count

# Tentukan rentang berdasarkan mana data dipartisi dalam partisi rentang atau partisi kolom rentang.
range_partition_list:
    range_partition [, range_partition ...]

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

# Tentukan daftar berdasarkan mana data dipartisi dalam partisi daftar atau partisi kolom daftar.
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' ]

# Sintaks DDL MySQL digunakan dalam contoh berikut:
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}

Setelah membuat tabel, Anda dapat mengeksekusi ALTER TABLE ADD GLOBAL INDEX untuk membuat indeks sekunder global. Dibandingkan dengan sintaks MySQL, sintaks ALTER TABLE ADD GLOBAL INDEX memperkenalkan kata kunci GLOBAL, yang menentukan bahwa indeks yang akan ditambahkan adalah indeks sekunder global.

Anda juga dapat mengeksekusi ALTER TABLE { DROP | RENAME } INDEX untuk memodifikasi indeks sekunder global. Namun, sintaks ini memiliki batasan pada penambahan indeks sekunder global setelah pembuatan tabel. Untuk detail lebih lanjut tentang batasan dan konvensi indeks sekunder global, lihat Buat dan gunakan GSIs.

Untuk informasi lebih lanjut tentang klausa yang digunakan untuk mendefinisikan indeks sekunder global, lihat CREATE TABLE (Mode DRDS).

Contoh

  • Add a global secondary index after a table is created

    Contoh berikut menunjukkan cara membuat tabel dan kemudian menambahkan indeks sekunder global.

    # 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;
    
    # Tambahkan indeks sekunder global.
    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: Dalam contoh sebelumnya, tabel bernama t_order dibuat di setiap shard database. Data di-shard menggunakan algoritma hash. Kolom order_id ditentukan sebagai kunci shard yang di-hash.

    • Tabel indeks: Dalam contoh sebelumnya, tabel indeks bernama g_i_buyer dibuat di setiap shard database. Data di-shard menggunakan algoritma hash. Kolom order_id ditentukan sebagai kunci shard yang di-hash. Kolom order_snapshot ditentukan sebagai kolom covering.

    • Klausa yang digunakan untuk mendefinisikan indeks sekunder global: UNIQUE GLOBAL INDEX `g_i_buyer`(`buyer_id`) COVERING (order_snapshot) partition by key(`buyer_id`) partitions 4.

    Eksekusi pernyataan SHOW INDEX untuk menanyakan informasi indeks. Informasi indeks mencakup indeks sekunder lokal pada kunci shard order_id dan indeks sekunder global pada kolom buyer_id, id, order_id, dan order_snapshot. Kolom buyer_id adalah kunci shard dari tabel indeks. Kolom id adalah kunci utama dari tabel dasar. Kolom order_id adalah kunci shard dari tabel dasar. Kolom id dan order_id adalah kolom covering default. order_snapshot adalah kolom covering yang Anda tentukan secara eksplisit.

    Catatan

    Untuk informasi lebih lanjut tentang batasan dan tindakan pencegahan penggunaan indeks sekunder global, lihat Buat dan gunakan GSIs. Untuk informasi lebih lanjut tentang pernyataan 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 mengeksekusi pernyataan SHOW GLOBAL INDEX untuk menanyakan hanya indeks sekunder global. 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)
                            

    Kode sampel berikut dapat digunakan untuk melihat skema tabel indeks. Tabel indeks berisi kunci utama tabel dasar, kunci shard database dan tabel, kolom covering default, dan kolom covering kustom. Atribut AUTO_INCREMENT dihapus dari kolom kunci utama. Indeks lokal pada tabel dasar juga dihapus. Secara default, indeks unik global dibuat pada semua kunci shard tabel indeks. Indeks tersebut digunakan sebagai kendala unik global tabel dasar.

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

    Hapus indeks sekunder global bernama g_i_seller. Tabel indeks yang sesuai juga dihapus.

    # Hapus indeks.
    ALTER TABLE `t_order` DROP INDEX `g_i_seller`;
  • Rename an index

    Secara default, indeks sekunder global tidak dapat diganti namanya. Untuk informasi lebih lanjut tentang batasan dan konvensi indeks sekunder global, lihat Buat dan gunakan GSIs.