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
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
idcardke tabeluser_log:ALTER TABLE user_log ADD COLUMN idcard varchar(30); -
Buat indeks
Buat indeks bernama
idcard_idxpada kolomidcarddi tabeluser_log:ALTER TABLE user_log ADD INDEX idcard_idx (idcard); -
Hapus indeks
Hapus indeks
idcard_idxdari tabeluser_log:ALTER TABLE user_log DROP INDEX idcard_idx; -
Ubah nama indeks
Ubah nama indeks
idcard_idxmenjadiidcard_idx_newpada tabeluser_log:ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`; -
Modifikasi kolom
Ubah panjang kolom
idcard(kolomvarchar) dari 30 menjadi 40 pada tabeluser_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.
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_orderdi-shard berdasarkan kunci pada kolomorder_id. -
Tabel indeks: Tabel indeks
g_i_buyerdi-shard berdasarkan kunci pada kolombuyer_id. Kolomorder_snapshotditentukan 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 INDEXuntuk 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.CatatanUntuk 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 INDEXuntuk 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.