ALTER TABLE(DRDS模式)
您可以通過(guò)ALTER TABLE語(yǔ)法改變表的結(jié)構(gòu),如增加列、增加索引、修改數(shù)據(jù)定義等。本語(yǔ)法僅適用于DRDS模式數(shù)據(jù)庫(kù)。
注意事項(xiàng)
不支持通過(guò)ALTER TABLE語(yǔ)法修改拆分字段。
語(yǔ)法
ALTER TABLE用于改變表的結(jié)構(gòu),如增加列、增加索引和修改數(shù)據(jù)定義。詳細(xì)語(yǔ)法請(qǐng)參見(jiàn)MySQL修改表語(yǔ)法。
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
示例
增加列
在“user_log”表中增加一列“idcard”,示例如下:
ALTER TABLE user_log ADD COLUMN idcard varchar(30);
增加局部索引
在“user_log”表中為“idcard”列增加一個(gè)名為“idcard_idx”的索引,示例如下:
ALTER TABLE user_log ADD INDEX idcard_idx (idcard);
重命名局部索引
將“user_log”表中“idcard_idx”索引命修改為“idcard_idx_new”,示例如下:
ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`;
刪除局部索引
刪除“user_log”表中的“idcard_idx”索引,示例如下:
ALTER TABLE user_log DROP INDEX idcard_idx;
修改字段
將“user_log”表中“idcard”列(字段類型為varchar)的長(zhǎng)度由30改為40,語(yǔ)法示例如下:
ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
全局二級(jí)索引
PolarDB-X支持全局二級(jí)索引 (Global Secondary Index, GSI),基本原理請(qǐng)參見(jiàn)全局二級(jí)索引。
列變更
使用全局二級(jí)索引的表,對(duì)列的修改,語(yǔ)法和普通表的一致。
當(dāng)修改的表包含全局二級(jí)索引時(shí),對(duì)列的修改有額外的限制,關(guān)于GSI的限制與約定,詳情請(qǐng)參見(jiàn)如何使用全局二級(jí)索引。
索引變更
語(yǔ)法
ALTER TABLE tbl_name
alter_specification # 全局二級(jí)索引相關(guān)變更僅支持一條alter_specification
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name # 全局二級(jí)索引必須顯式指定索引名
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE GLOBAL
[INDEX|KEY] index_name # 全局二級(jí)索引必須顯式指定索引名
[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 # 包含且僅包含index_sharding_col_name中指定的列
# 指定索引表拆分方式
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)
# 以下為MySQL DDL語(yǔ)法
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
系列語(yǔ)法用于在建表后添加GSI,該系列語(yǔ)法在MySQL語(yǔ)法上新引入了GLOBAL關(guān)鍵字,用于指定添加的索引類型為GSI。
ALTER TABLE { DROP | RENAME } INDEX
語(yǔ)法同樣可以對(duì)GSI進(jìn)行修改,目前建表后創(chuàng)建GSI存在一定限制。關(guān)于GSI的限制與約定,詳情請(qǐng)參見(jiàn)如何使用全局二級(jí)索引。
全局二級(jí)索引定義子句詳細(xì)說(shuō)明請(qǐng)參見(jiàn)CREATE TABLE(DRDS模式)。
示例
建表后添加全局二級(jí)索引
下面以建立全局唯一索引為例,介紹在建表后如何創(chuàng)建GSI。
# 創(chuàng)建表 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`); # 創(chuàng)建全局二級(jí)索引 ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`);
主表:”t_order“只分庫(kù)不分表,分庫(kù)的拆分方式為按照”order_id“列進(jìn)行哈希。
索引表:”g_i_buyer“只分庫(kù)不分表,分庫(kù)的拆分方式為按照”buyer_id“列進(jìn)行哈希,指定覆蓋列為”order_snapshot“。
索引定義子句:
GLOBAL INDEX `g_i_seller` ON t_order (`seller_id`) dbpartition by hash(`seller_id`)
。
通過(guò)
SHOW INDEX
查看索引信息,包含拆分鍵order_id上的局部索引,和buyer_id、id、order_id和order_snapshot上的GSI,其中buyer_id為索引表的拆分鍵,id和order_id為默認(rèn)的覆蓋列(主鍵和主表的拆分鍵),order_snapshot顯式指定的覆蓋列。說(shuō)明關(guān)于GSI的限制與約定,詳情請(qǐng)參見(jiàn)如何使用全局二級(jí)索引,SHOW INDEX詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)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 | 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 | | +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
通過(guò)
SHOW GLOBAL INDEX
可以單獨(dú)查看GSI信息,詳情請(qǐng)參見(jiàn)SHOW GLOBAL INDEX。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 | +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
查看索引表的結(jié)構(gòu),索引表包含主表的主鍵、分庫(kù)分表鍵、默認(rèn)的覆蓋列和自定義覆蓋列,主鍵列去除了AUTO_INCREMENT屬性,并且去除了主表中的局部索引,全局唯一索引默認(rèn)在索引表的所有分庫(kù)分表鍵上創(chuàng)建一個(gè)唯一索引,以實(shí)現(xiàn)全局唯一約束。
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`) | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
刪除全局二級(jí)索引
刪除名為g_i_seller的GSI,相應(yīng)的索引表也將被刪除。
# 刪除索引 ALTER TABLE `t_order` DROP INDEX `g_i_seller`;
重命名索引
默認(rèn)情況下限制對(duì)GSI的重命名。關(guān)于GSI的限制與約定,詳情請(qǐng)參見(jiàn)全局二級(jí)索引使用。