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
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
idcarda la tablauser_log:ALTER TABLE user_log ADD COLUMN idcard varchar(30); -
Agregar un índice local
Agregue un índice llamado
idcard_idxen la columnaidcardde la tablauser_log:ALTER TABLE user_log ADD INDEX idcard_idx (idcard); -
Cambiar el nombre de un índice local
Cambie el nombre del índice
idcard_idxde la tablauser_logaidcard_idx_new:ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`; -
Eliminar un índice local
Elimine el índice
idcard_idxde la tablauser_log:ALTER TABLE user_log DROP INDEX idcard_idx; -
Modificar una columna
Cambie la longitud de la columna
idcard(varchar) de la tablauser_logde 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.
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_orderse fragmenta solo por base de datos (no por tabla). El método de fragmentación de la base de datos es hash en la columnaorder_id.Tabla de índice:
g_i_buyerse fragmenta solo por base de datos (no por tabla). El método de fragmentación de la base de datos es hash en la columnabuyer_id, y la columna de cobertura esorder_snapshot.Cláusula de definición del índice:
GLOBAL INDEX.
Use
SHOW INDEXpara consultar la información del índice. Los resultados incluyen el índice local en la clave de fragmentaciónorder_idy el GSI, el cual está indexado en buyer_id e incluye varias columnas de cobertura. En este ejemplo,buyer_ides la clave de fragmentación de la tabla de índice. Las columnasidyorder_idson columnas de cobertura predeterminadas (la clave principal y la clave de fragmentación de la tabla base). La columnaorder_snapshotes la columna de cobertura especificada de forma explícita.NotaPara 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 INDEXpara 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_INCREMENTde 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.