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
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.
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 INDEXuntuk 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.CatatanUntuk 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 INDEXuntuk 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.