O comando ALTER TABLE modifica o esquema de uma tabela existente em um banco de dados PolarDB-X no modo DRDS. Você pode adicionar ou remover colunas, criar ou excluir índices e alterar os tipos de dados das colunas.
Operações suportadas
No modo DRDS, o ALTER TABLE suporta as seguintes operações: adicionar colunas, criar índices e alterar o tipo de dados ou outros atributos das colunas.
Ao usar oALTER TABLEpara modificar um GSI, a opçãoalter_specificationdeve aparecer apenas uma vez na instrução.
Limitações
Não é possível alterar a chave de shard de uma tabela com ALTER TABLE.
Para restrições específicas de GSI, consulte Como usar índices secundários globais.
Sintaxe
ALTER TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
Para a sintaxe completa compatível com MySQL, consulte a instrução ALTER TABLE do MySQL.
Sintaxe de GSI
Ao modificar um índice secundário global (GSI), use a sintaxe abaixo. Inclua alter_specification apenas uma vez por instrução.
ALTER TABLE tbl_name
alter_specification
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name -- Explicitly specify the GSI name.
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE GLOBAL
[INDEX|KEY] index_name -- Explicitly specify the GSI 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
global_secondary_index_option:
[COVERING (col_name,...)] -- Covering index columns
drds_partition_options -- Specify one or more columns that are listed in index_sharding_col_name.
-- Sharding options
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 syntax
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}
A sintaxe ADD GLOBAL INDEX estende a DDL do MySQL com a palavra-chave GLOBAL para criar um GSI. O comando ALTER TABLE { DROP | RENAME } INDEX remove ou renomeia um GSI pelo nome do índice.
Para obter detalhes sobre as cláusulas usadas na criação de GSIs, consulte CREATE TABLE (modo DRDS).
Exemplos
Operações básicas de coluna e índice
Os exemplos a seguir usam uma tabela user_log para demonstrar alterações comuns de esquema.
Adicionar uma coluna
ALTER TABLE user_log
ADD COLUMN idcard varchar(30);
Modify a column
Altere a coluna idcard de varchar(30) para varchar(40):
ALTER TABLE user_log
MODIFY COLUMN idcard varchar(40);
Crie um índice local
ALTER TABLE user_log
ADD INDEX idcard_idx (idcard);
Renomear um índice local
ALTER TABLE user_log
RENAME INDEX `idcard_idx` TO `idcard_idx_new`;
Remover um índice local
ALTER TABLE user_log
DROP INDEX idcard_idx;
Operações de GSI
Crie um GSI em uma tabela existente
Considere uma tabela t_order com sharding por order_id:
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`);
Adicione um GSI único chamado g_i_buyer para permitir consultas por buyer_id:
ALTER TABLE t_order
ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`)
COVERING (`order_snapshot`)
dbpartition by hash(`buyer_id`);
Essa operação cria uma tabela de índice g_i_buyer com a seguinte estrutura:
Chave de shard:
buyer_id, distribuída por hash entre os shards de banco de dadosColunas de cobertura padrão:
id(chave primária da tabela base) eorder_id(chave de shard da tabela base)Coluna de cobertura explícita:
order_snapshot
Para verifique, consulte os índices em t_order:
SHOW INDEX FROM t_order;
A saída lista o índice local em order_id e o GSI em buyer_id, id, order_id e order_snapshot:
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| 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 | |
+---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
Para obter detalhes específicos de particionamento do GSI, como chave de shard, política de partição e contagem de partições, use 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 |
+---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
Para inspecionar diretamente o esquema da tabela de índice:
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`) |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Observe que a chave primária na tabela de índice não possui o atributo AUTO_INCREMENT. Os índices locais da tabela base são removidos e um índice globalmente único é criado em todas as chaves de shard para garantir uma restrição de unicidade global.
Para limites e convenções de GSI, consulte Como usar índices secundários globais . Para detalhes da saída doSHOW INDEX, consulte SHOW INDEX . Para detalhes da saída doSHOW GLOBAL INDEX, consulte SHOW GLOBAL INDEX .
Remover um GSI
Remova o GSI chamado g_i_seller. A tabela de índice correspondente também é excluída.
ALTER TABLE `t_order` DROP INDEX `g_i_seller`;
Renomear um GSI
Por padrão, não é possível renomear GSIs. Para mais detalhes, consulte Como usar índices secundários globais.