您可以通過ALTER TABLE文法改變表的結構,如增加列、增加索引、修改資料定義等。本文法僅適用於AUTO模式資料庫。
注意事項
執行個體版本小於5.4.17-16835173 時,不支援通過ALTER TABLE文法修改拆分欄位。
文法
ALTER TABLE用於改變表的結構,如增加列、增加索引和修改資料定義。詳細文法請參見MySQL修改表文法。
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
[local_partition_alter_options]
樣本
增加列
在“user_log”表中增加一列“idcard”,樣本如下:
ALTER TABLE user_log ADD COLUMN idcard varchar(30);
增加索引
在“user_log”表中為“idcard”列增加一個名為“idcard_idx”的索引,樣本如下:
ALTER TABLE user_log ADD INDEX idcard_idx (idcard);
刪除索引
刪除“user_log”表中的“idcard_idx”索引,樣本如下:
ALTER TABLE user_log DROP INDEX idcard_idx;
重新命名索引
將“user_log”表中“idcard_idx”索引命修改為“idcard_idx_new”,樣本如下:
ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`;
修改欄位
將“user_log”表中“idcard”列(欄位類型為varchar)的長度由30改為40,文法樣本如下:
ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
全域二級索引
PolarDB-X支援全域二級索引 (Global Secondary Index,GSI),基本原理請參見全域二級索引。
列變更
使用全域二級索引的表,對列的修改,文法和普通表的一致。
當修改的表包含全域二級索引時,對列的修改有額外的限制,關於GSI的限制與約定,詳情請參見如何使用全域二級索引。
索引變更
文法
ALTER TABLE tbl_name
alter_specification # 全域二級索引相關變更僅支援一條alter_specification
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name # 全域二級索引必須顯式指定索引名
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE GLOBAL
[INDEX|KEY] index_name # 全域二級索引必須顯式指定索引名
[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
# 關於全域二級索引特有文法,詳情請參見CREATE TABLE文檔
global_secondary_index_option:
[COVERING (col_name,...)] # Covering Index
partition_options # 包含且僅包含 index_sharding_col_name 中指定的列
# 指定索引表拆分方式
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
# 分區函數定義
partition_func:
YEAR
| TO_DAYS
| TO_SECOND
| UNIX_TIMESTAMP
| MONTH
# 分區列表定義
partition_list_spec:
hash_partition_list
| range_partition_list
| list_partition_list
# Hash/Key分區表列定義
hash_partition_list:
PARTITIONS partition_count
# Range/Range Columns分區表列定義
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name VALUES LESS THAN {(expr | value_list)} [partition_spec_options]
# 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' ]
# 以下為MySQL DDL文法
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}
ALTER TABLE ADD GLOBAL INDEX
系列文法用於在建表後添加GSI,該系列文法在MySQL文法上新引入了GLOBAL關鍵字,用於指定添加的索引類型為GSI。
ALTER TABLE { DROP | RENAME } INDEX
文法同樣可以對GSI進行修改,目前建表後建立GSI存在一定限制。關於GSI的限制與約定,詳情請參見如何使用全域二級索引。
全域二級索引定義子句詳細說明請參見CREATE TABLE(DRDS模式)。
樣本
建表後添加全域二級索引
下面以建立全域唯一索引為例,介紹在建表後如何建立GSI。
# 建立表 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; # 建立全域二級索引 ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) partition by key(`buyer_id`) partitions 4;
主表:”t_order“只分庫不分表,分庫的拆分方式為按照”order_id“列進行雜湊。
索引表:”g_i_buyer“只分庫不分表,分庫的拆分方式為按照”buyer_id“列進行雜湊,指定覆蓋列為”order_snapshot“。
索引定義子句:
UNIQUE GLOBAL INDEX `g_i_buyer`(`buyer_id`) COVERING (order_snapshot) partition by key(`buyer_id`) partitions 4
。
通過
SHOW INDEX
查看索引資訊,包含拆分鍵order_id上的局部索引,和buyer_id、id、order_id和order_snapshot上的GSI,其中buyer_id為索引表的拆分鍵,id和order_id為預設的覆蓋列(主鍵和主表的拆分鍵),order_snapshot顯式指定的覆蓋列。說明關於GSI的限制與約定,詳情請參見如何使用全域二級索引,SHOW INDEX詳細說明,請參見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)
通過
SHOW GLOBAL INDEX
可以單獨查看GSI資訊,詳情請參見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)
查看索引表的結構,索引表包含主表的主鍵、分庫分表鍵、預設的覆蓋列和自訂覆蓋列,主鍵列去除了AUTO_INCREMENT屬性,並且去除了主表中的局部索引,全域唯一索引預設在索引表的所有分庫分表鍵上建立一個唯一索引,以實現全域唯一約束。
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)
刪除全域二級索引
刪除名為g_i_seller的GSI,相應的索引表也將被刪除。
# 刪除索引 ALTER TABLE `t_order` DROP INDEX `g_i_seller`;
重新命名索引
預設情況下限制對GSI的重新命名。關於GSI的限制與約定,詳情請參見全域二級索引使用。