Gunakan pernyataan ALTER TABLE untuk mengubah struktur tabel yang sudah ada, seperti menambahkan kolom, membuat indeks, atau mengubah definisi kolom.
Catatan penggunaan
- Anda tidak dapat menggunakan pernyataan
ALTER TABLEuntuk mengubah kunci shard. - Untuk menggunakan pernyataan
ALTERpada tabel yang berisi global secondary index (GSI), Anda harus menggunakan MySQL 5.7 atau versi yang lebih baru serta PolarDB-X 1.0 5.4.1 atau versi yang lebih baru.
Ubah tabel standar
Sintaks
ALTER [ONLINE|OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
Example
- Tambahkan kolom
Contoh berikut menambahkan kolom bernama
idcardke tabeluser_log:ALTER TABLE user_log ADD COLUMN idcard varchar(30); - Buat indeks lokal
Contoh berikut membuat indeks lokal bernama
idcard_idxpada kolomidcarddi tabeluser_log:ALTER TABLE user_log ADD INDEX idcard_idx (idcard); - Ubah nama indeks lokal
Contoh berikut mengubah nama indeks
idcard_idxmenjadiidcard_idx_newdi tabeluser_log:ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`; - Hapus indeks lokal
Contoh berikut menghapus indeks
idcard_idxdari tabeluser_log:ALTER TABLE user_log DROP INDEX idcard_idx; - Ubah kolom
Contoh berikut mengubah panjang kolom
idcardyang bertipe datavarchardari 30 menjadi 40 di tabeluser_log:ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
Ubah tabel dengan GSI
Column modifications
Saat mengubah kolom pada tabel yang berisi GSI, sintaksnya sama seperti pada tabel standar, tetapi terdapat beberapa batasan. Untuk informasi selengkapnya, lihat Pertimbangan saat menggunakan global secondary index.
- Tabel berikut merangkum dukungan untuk modifikasi kolom dengan pernyataan ALTER TABLE.
Pernyataan Kunci shard tabel utama Kunci primer (juga kunci primer tabel indeks) Kolom indeks unik lokal Kunci shard GSI Kolom indeks unik Kolom indeks Kolom covering ADD COLUMN N/A Tidak didukung N/A N/A N/A N/A N/A ALTER COLUMN SET DEFAULT dan ALTER COLUMN DROP DEFAULT Tidak didukung Tidak didukung Didukung Tidak didukung Tidak didukung Tidak didukung Tidak didukung CHANGE COLUMN Tidak didukung Tidak didukung Didukung Tidak didukung Tidak didukung Tidak didukung Tidak didukung DROP COLUMN Tidak didukung Tidak didukung Didukung hanya jika kunci unik memiliki satu kolom. Tidak didukung Tidak didukung Tidak didukung Tidak didukung MODIFY COLUMN Tidak didukung Tidak didukung Didukung Tidak didukung Tidak didukung Tidak didukung Tidak didukung - Tabel berikut merangkum dukungan untuk modifikasi indeks dengan pernyataan ALTER TABLE.
Pernyataan Dukungan ALTER TABLE ADD PRIMARY KEY Didukung ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY Didukung. Anda dapat menambahkan indeks lokal baik pada tabel utama maupun tabel indeks. Nama indeks tidak boleh sama dengan nama GSI mana pun. ALTER TABLE ALTER INDEX index_name {VISIBLE | INVISIBLE} Dilarang ALTER TABLE {DISABLE | ENABLE} KEYS Didukung. Pernyataan ini hanya dijalankan pada tabel utama. Mengubah status GSI dilarang. ALTER TABLE DROP PRIMARY KEY Dilarang ALTER TABLE DROP INDEX Didukung hanya untuk menghapus indeks lokal atau global secondary index. ALTER TABLE RENAME INDEX Dilarang
Modifikasi indeks
Sintaks
ALTER TABLE tbl_name
alter_specification # Hanya satu alter_specification yang didukung untuk modifikasi GSI.
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name # Anda harus secara eksplisit menentukan nama indeks untuk GSI.
[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 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,...)] # Covering Index
drds_partition_options # Harus hanya berisi kolom yang ditentukan dalam index_sharding_col_name.
# Tentukan metode sharding untuk tabel indeks.
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)
# Berikut adalah sintaks 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}
Gunakan pernyataan ALTER TABLE ADD GLOBAL INDEX untuk menambahkan GSI ke tabel yang sudah ada. Pernyataan ini menambahkan kata kunci GLOBAL ke sintaks MySQL standar guna menunjukkan bahwa indeks baru tersebut merupakan GSI.
ALTER TABLE { DROP | RENAME } INDEX untuk mengubah GSI. Namun, terdapat beberapa batasan saat membuat GSI setelah tabel dibuat. Untuk detail mengenai batasan dan konvensi GSI, lihat Pertimbangan saat menggunakan global secondary index.
Untuk informasi selengkapnya tentang klausa yang digunakan untuk mendefinisikan global secondary index, lihat CREATE TABLE.
Contoh
Contoh berikut menunjukkan cara membuat global secondary index unik setelah tabel dibuat.
- Buat GSI
# 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 dbpartition by hash(`order_id`); # Buat global secondary index (GSI). ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`);- Tabel utama: Tabel
t_ordermenggunakan sharding database tetapi tidak menggunakan sharding tabel. Data dishard di berbagai database berdasarkan hash kolomorder_id. - Tabel indeks: Tabel
g_i_buyermenggunakan sharding database tetapi tidak menggunakan sharding tabel. Data dishard di berbagai database berdasarkan hash kolombuyer_id. Kolomorder_snapshotditentukan sebagai kolom covering. - Klausa definisi indeks:
GLOBAL INDEX `g_i_buyer` ON t_order (`buyer_id`) dbpartition by hash(`buyer_id`).
- Tabel utama: Tabel
- Jalankan pernyataan
SHOW INDEXuntuk melihat informasi indeks. Hasilnya mencakup indeks lokal pada kunci shardorder_iddan GSI, yang mencakup kolombuyer_id,id,order_id, danorder_snapshot. Dalam GSI ini,buyer_idadalah kunci shard tabel indeks.id(kunci primer tabel utama) danorder_id(kunci shard tabel utama) disertakan sebagai kolom covering default, sedangkanorder_snapshotadalah kolom covering yang ditentukan secara eksplisit.mysql> 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 | | +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+ - Anda dapat menjalankan pernyataan
SHOW GLOBAL INDEXuntuk melihat informasi spesifik GSI. Untuk informasi selengkapnya, lihat SHOW GLOBAL INDEX.mysql> 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 | +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ - Lihat struktur tabel indeks. Tabel indeks berisi kolom kunci primer, kunci shard, kolom covering default, dan kolom covering yang ditentukan secara eksplisit dari tabel utama. Atribut
AUTO_INCREMENTdihapus dari kolom kunci primer, dan indeks lokal dari tabel utama tidak disertakan. Untuk GSI unik, indeks unik dibuat secara default pada semua kolom kunci shard-nya untuk menegakkan batasan unik global.mysql> 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`) | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ - Hapus GSI
Hapus GSI bernama
g_i_buyer. Tabel indeks yang sesuai juga akan dihapus.ALTER TABLE `t_order` DROP INDEX `g_i_buyer`; - Ubah nama indeks
Secara default, mengubah nama GSI dilarang.