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 TABLEpara modificar una clave de fragmentación (shard key).Para usar la instrucción
ALTERen 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
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
.
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
idcarda la tablauser_log:ALTER TABLE user_log ADD COLUMN idcard varchar(30); -
Crear un índice local
El siguiente ejemplo crea un índice local llamado
idcard_idxen la columnaidcardde la tablauser_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_idxaidcard_idx_newen la tablauser_log:ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`; -
Eliminar un índice local
El siguiente ejemplo elimina el índice
idcard_idxde la tablauser_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 esvarchar, de 30 a 40 en la tablauser_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_orderutiliza fragmentación de bases de datos, pero no de tablas. Los datos se fragmentan entre las bases de datos mediante un hash de la columnaorder_id.Tabla de índices: la tabla
g_i_buyerutiliza fragmentación de bases de datos, pero no de tablas. Los datos se fragmentan entre las bases de datos mediante un hash de la columnabuyer_id. La columnaorder_snapshotse especifica como columna de cobertura.Cláusula de definición del índice:
GLOBAL INDEX.
-
Ejecute la instrucción
SHOW INDEXpara consultar la información de los índices. El resultado incluye el índice local en la clave de fragmentaciónorder_idy el GSI, que abarca las columnasbuyer_id,id,order_idyorder_snapshot. En este GSI,buyer_ides la clave de fragmentación de la tabla de índices. Las columnasid(clave principal de la tabla principal) yorder_id(clave de fragmentación de la tabla principal) se incluyen como columnas de cobertura predeterminadas, mientras queorder_snapshotes 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 INDEXpara 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_INCREMENTse 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.