Todos os produtos
Search
Central de documentação

PolarDB:ALTER TABLE (modo DRDS)

Última atualização: Jun 28, 2026

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 o ALTER TABLE para modificar um GSI, a opção alter_specification deve 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 dados

  • Colunas de cobertura padrão: id (chave primária da tabela base) e order_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 do SHOW INDEX , consulte SHOW INDEX . Para detalhes da saída do SHOW 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.

Próximos passos