Todos los productos
Search
Centro de documentos

PolarDB:ALTER TABLE

Última actualización: Sep 05, 2026

Utilice la instrucción ALTER TABLE para modificar la estructura de una tabla existente. Por ejemplo, puede agregar columnas, crear índices o cambiar las definiciones de las columnas.

Notas de uso

  • No es posible utilizar la instrucción ALTER TABLE para modificar una clave de fragmentación (shard key).

  • Para usar la instrucción ALTER en una tabla que contiene un índice secundario global (GSI), se requiere MySQL 5.7 o posterior y PolarDB-X 1.0 5.4.1 o posterior.

Modificar una tabla estándar

Nota

En

PolarDB-X 1.0

, la sintaxis para modificar una tabla estándar es la misma que la sintaxis nativa de MySQL. Para obtener más información, consulte la documentación de MySQL sobre la

instrucción ALTER TABLE

.

Sintaxis

ALTER [ONLINE|OFFLINE] [IGNORE] TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options]

Example

  • Agregar una columna

    A continuación se muestra cómo agregar una columna llamada idcard a la tabla user_log:

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

    El siguiente ejemplo crea un índice local 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

    Este ejemplo cambia el nombre del índice idcard_idx a idcard_idx_new en la tabla user_log:

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

    El siguiente ejemplo elimina el índice idcard_idx de la tabla user_log:

    ALTER TABLE user_log DROP INDEX idcard_idx;
  • Modificar una columna

    En este ejemplo se cambia la longitud de la columna idcard, cuyo tipo de dato es varchar, de 30 a 40 en la tabla user_log:

    ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);

Modificar una tabla con un GSI

Column modifications

Cuando se modifica una columna en una tabla que contiene un GSI, la sintaxis es la misma que para una tabla estándar, pero aplican ciertas limitaciones. Para obtener más información, consulte Considerations for using global secondary indexes.

  • La siguiente tabla resume la compatibilidad de las modificaciones de columnas con la instrucción ALTER TABLE.

    Instrucción

    Clave de fragmentación de la tabla principal

    Clave principal (también clave principal de la tabla de índices)

    Columna de índice único local

    Clave de fragmentación del GSI

    Columna de índice único

    Columna de índice

    Columna de cobertura

    ADD COLUMN

    N/A

    No compatible

    N/A

    N/A

    N/A

    N/A

    N/A

    ALTER COLUMN SET DEFAULT y ALTER COLUMN DROP DEFAULT

    No compatible

    No compatible

    Compatible

    No compatible

    No compatible

    No compatible

    No compatible

    CHANGE COLUMN

    No compatible

    No compatible

    Compatible

    No compatible

    No compatible

    No compatible

    No compatible

    DROP COLUMN

    No compatible

    No compatible

    Compatible solo si la clave única tiene una columna.

    No compatible

    No compatible

    No compatible

    No compatible

    MODIFY COLUMN

    No compatible

    No compatible

    Compatible

    No compatible

    No compatible

    No compatible

    No compatible

  • La siguiente tabla resume la compatibilidad de las modificaciones de índices con la instrucción ALTER TABLE.

    Instrucción

    Compatibilidad

    ALTER TABLE ADD PRIMARY KEY

    Compatible

    ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY

    Compatible. Puede agregar índices locales tanto en la tabla principal como en la tabla de índices. El nombre del índice no puede ser igual al de ningún GSI.

    ALTER TABLE ALTER INDEX index_name {VISIBLE

    INVISIBLE}

    Prohibido

    ALTER TABLE {DISABLE

    ENABLE} KEYS

    Compatible. Esta instrucción se ejecuta únicamente en la tabla principal. Está prohibido modificar el estado del GSI.

    ALTER TABLE DROP PRIMARY KEY

    Prohibido

    ALTER TABLE DROP INDEX

    Compatible solo para eliminar un índice local o un índice secundario global.

    ALTER TABLE RENAME INDEX

    Prohibido

Modificaciones de índices

Sintaxis

ALTER TABLE tbl_name
    alter_specification # Only one alter_specification is supported for GSI modifications.

alter_specification:
  | ADD GLOBAL {INDEX|KEY} index_name # You must explicitly specify the index name for a GSI.
      [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 index name for a GSI.
      [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 the 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) 

# The following is 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}

Utilice la instrucción ALTER TABLE ADD GLOBAL INDEX para agregar un GSI a una tabla existente. Esta instrucción añade la palabra clave GLOBAL a la sintaxis estándar de MySQL para indicar que el nuevo índice es un GSI.

También puede usar la instrucción

ALTER TABLE { DROP | RENAME } INDEX

para modificar un GSI. Sin embargo, existen ciertas limitaciones cuando se crea un GSI después de haber creado la tabla.

Para conocer los detalles sobre las limitaciones y convenciones de los GSI, consulte

Considerations for using global secondary indexes

.

Para obtener más información sobre las cláusulas utilizadas para definir un índice secundario global, consulte CREATE TABLE.

Ejemplo

El siguiente ejemplo muestra cómo crear un índice secundario global único después de haber creado una tabla.

  • Crear un GSI

    # 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 (GSI).
    ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`);
    • Tabla principal: la tabla t_order utiliza fragmentación de bases de datos, pero no de tablas. Los datos se fragmentan entre las bases de datos mediante un hash de la columna order_id.

    • Tabla de índices: la tabla g_i_buyer utiliza fragmentación de bases de datos, pero no de tablas. Los datos se fragmentan entre las bases de datos mediante un hash de la columna buyer_id. La columna order_snapshot se especifica como columna de cobertura.

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

  • Ejecute la instrucción SHOW INDEX para consultar la información de los índices. El resultado incluye el índice local en la clave de fragmentación order_id y el GSI, que abarca las columnas buyer_id, id, order_id y order_snapshot. En este GSI, buyer_id es la clave de fragmentación de la tabla de índices. Las columnas id (clave principal de la tabla principal) y order_id (clave de fragmentación de la tabla principal) se incluyen como columnas de cobertura predeterminadas, mientras que order_snapshot es la columna de cobertura especificada de manera explícita.

    mysql> 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 |               |
    +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
  • Puede ejecutar la instrucción SHOW GLOBAL INDEX para consultar la información específica del GSI. Para obtener más información, consulte SHOW GLOBAL INDEX.

    mysql> 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 |
    +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
  • Consulte la estructura de la tabla de índices. Esta tabla contiene la clave principal, las columnas de la clave de fragmentación, las columnas de cobertura predeterminadas y las columnas de cobertura especificadas de manera explícita de la tabla principal. El atributo AUTO_INCREMENT se elimina de la columna de clave principal y se excluyen los índices locales de la tabla principal. En un GSI único, se crea de forma predeterminada un índice único sobre todas sus columnas de clave de fragmentación para aplicar la restricción de unicidad global.

    mysql> 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`) |
    +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  • Eliminar un GSI

    Elimine el GSI llamado g_i_buyer. También se elimina la tabla de índices correspondiente.

    ALTER TABLE `t_order` DROP INDEX `g_i_buyer`;
  • Cambiar el nombre de un índice

    De forma predeterminada, está prohibido cambiar el nombre de un GSI.