Todos los productos
Search
Centro de documentos

PolarDB:ALTER TABLE (modo DRDS)

Última actualización: Sep 05, 2026

Utilice la instrucción ALTER TABLE para cambiar la estructura de una tabla, por ejemplo, para agregar columnas o índices, o bien para modificar definiciones de datos. Esta instrucción solo aplica a bases de datos en modo DRDS.

Notas de uso

No es posible usar la instrucción ALTER TABLE para modificar una clave de fragmentación.

Sintaxis

Nota

Para consultar la sintaxis detallada, consulte la instrucción ALTER TABLE de MySQL.

ALTER TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options]

Example

  • Agregar una columna

    Agregue una columna idcard a la tabla user_log:

    ALTER TABLE user_log
        ADD COLUMN idcard varchar(30);
  • Agregar un índice local

    Agregue un índice llamado idcard_idx en la columna idcard de la tabla user_log:

    ALTER TABLE user_log
        ADD INDEX idcard_idx (idcard);
  • Cambiar el nombre de un índice local

    Cambie el nombre del índice idcard_idx de la tabla user_log a idcard_idx_new:

    ALTER TABLE user_log
        RENAME INDEX `idcard_idx` TO `idcard_idx_new`;
  • Eliminar un índice local

    Elimine el índice idcard_idx de la tabla user_log:

    ALTER TABLE user_log
        DROP INDEX idcard_idx;
  • Modificar una columna

    Cambie la longitud de la columna idcard (varchar) de la tabla user_log de 30 a 40:

    ALTER TABLE user_log
        MODIFY COLUMN idcard varchar(40);

Índices secundarios globales

PolarDB-X es compatible con los índices secundarios globales (GSI). Para obtener más información sobre los principios básicos, consulte Global secondary indexes.

Modificaciones de columnas

En las tablas que usan GSI, la sintaxis para modificar columnas es la misma que se utiliza en las tablas normales.

Nota

Al modificar una tabla que contiene un índice secundario global, las modificaciones de columnas tienen restricciones adicionales. Para obtener más información sobre los límites y las convenciones de los GSI, consulte Create and use global secondary indexes.

Modificaciones de índices

Sintaxis

ALTER TABLE tbl_name
    alter_specification # For GSI-related changes, only one alter_specification is supported.

alter_specification:
  | ADD GLOBAL {INDEX|KEY} index_name # You must 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 # You must 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
    drds_partition_options # Must contain only columns specified in index_sharding_col_name.

# Specify the sharding method for the index table.
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}

La instrucción ALTER TABLE ADD GLOBAL INDEX agrega un GSI a una tabla existente. Extiende la sintaxis de MySQL al introducir la palabra clave GLOBAL para indicar que el índice agregado es un GSI.

La sintaxis ALTER TABLE { DROP | RENAME } INDEX también permite modificar un GSI. Estas operaciones tienen limitaciones específicas. Para obtener más información sobre los límites y las convenciones de los GSI, consulte Create and use global secondary indexes.

Para consultar las descripciones detalladas de las cláusulas de definición de GSI, consulte CREATE TABLE (DRDS mode).

Ejemplos

  • Crear un índice secundario global

    Este ejemplo crea un GSI único en una tabla existente.

    # Create a table
    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`);
    # Create a global secondary index
    ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`);
    • Tabla base: t_order se fragmenta solo por base de datos (no por tabla). El método de fragmentación de la base de datos es hash en la columna order_id.

    • Tabla de índice: g_i_buyer se fragmenta solo por base de datos (no por tabla). El método de fragmentación de la base de datos es hash en la columna buyer_id, y la columna de cobertura es order_snapshot.

    • Cláusula de definición del índice: GLOBAL INDEX .

    Use SHOW INDEX para consultar la información del índice. Los resultados incluyen el índice local en la clave de fragmentación order_id y el GSI, el cual está indexado en buyer_id e incluye varias columnas de cobertura. En este ejemplo, buyer_id es la clave de fragmentación de la tabla de índice. Las columnas id y order_id son columnas de cobertura predeterminadas (la clave principal y la clave de fragmentación de la tabla base). La columna order_snapshot es la columna de cobertura especificada de forma explícita.

    Nota

    Para obtener detalles sobre los límites y las convenciones de los GSI, consulte Create and use global secondary indexes. Para obtener detalles sobre SHOW INDEX, consulte SHOW INDEX.

    show index from t_order;

    Se devuelve el siguiente resultado:

    +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
    | 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 |               |
    +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+

    Puede usar SHOW GLOBAL INDEX para consultar únicamente la información del GSI. Para obtener más información, consulte SHOW GLOBAL INDEX.

    show global index from t_order;

    Se devuelve el siguiente resultado:

    +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
    | 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 |
    +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+

    Consulte la estructura de la tabla de índice. Esta tabla incluye la clave principal y la clave de fragmentación de la tabla base, junto con las columnas de cobertura predeterminadas y personalizadas. Se elimina el atributo AUTO_INCREMENT de la columna de clave principal y se excluyen los índices locales de la tabla base. De manera predeterminada, se crea un índice único en la clave de fragmentación de la tabla de índice para aplicar una restricción de unicidad global.

    show create table g_i_buyer;

    Se devuelve el siguiente resultado:

    +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | 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`)               |
    +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  • Eliminar un índice secundario global

    Elimine el GSI llamado g_i_seller. También se elimina la tabla de índice correspondiente.

    # Drop the index
    ALTER TABLE `t_order` DROP INDEX `g_i_seller`;
  • Cambiar el nombre de un índice

    De manera predeterminada, no se permite cambiar el nombre de un GSI. Para obtener detalles sobre los límites y las convenciones de los GSI, consulte Create and use global secondary indexes.