ALTER TABLE modifica el esquema de una tabla existente en AnalyticDB for MySQL. Con este comando se renombran tablas y columnas, se cambian los tipos de datos y las restricciones de las columnas, se gestionan índices, se ajustan los ciclos de vida de las particiones y se configuran políticas de almacenamiento por niveles.
Tabla de ejemplo
La mayoría de los ejemplos de este tema utilizan la tabla customer. Si aún no la ha creado, ejecute la siguiente instrucción:
Los ejemplos de índices JSON, claves externas e índices vectoriales usan sus propias definiciones de tabla.
Sintaxis
ALTER TABLE table_name
{ ADD [COLUMN] column_name column_definition
| ADD [COLUMN] (column_name column_definition,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES pk_table_name (pk_column_name)
| ADD {INDEX|KEY} [index_name] (column_name)
| ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
| ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
| ADD CLUSTERED [INDEX|KEY] [index_name] (column_name [ASC|DESC])
| ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
| ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]
| COMMENT 'comment'
| DROP CLUSTERED KEY index_name
| DROP [COLUMN] column_name
| DROP FOREIGN KEY symbol
| DROP FULLTEXT INDEX index_name
| DROP {INDEX|KEY} index_name
| DROP PARTITION (partition_name,...)
| MODIFY [COLUMN] column_name column_definition
| RENAME COLUMN column_name TO new_column_name
| RENAME new_table_name
| INDEX_ALL = {'Y'|'N'}
| storage_policy
| PARTITION BY VALUE{(column_name)|(DATE_FORMAT(column_name, 'format'))|(FROM_UNIXTIME(column_name, 'format'))} LIFECYCLE N
}
column_definition:
column_type [column_attributes][column_constraints][COMMENT 'comment']
column_attributes:
[DEFAULT{constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT]
column_constraints:
[NULL|NOT NULL]
storage_policy:
STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
Tablas
Renombrar una tabla
ALTER TABLE db_name.table_name RENAME new_table_name
Ejemplo: Cambie el nombre de customer a new_customer.
ALTER TABLE customer RENAME new_customer;
Modificar el comentario de una tabla
ALTER TABLE db_name.table_name COMMENT 'comment'
Ejemplo: Actualice el comentario de la tabla customer.
ALTER TABLE customer COMMENT 'Customer table';
Columnas
Agregar una columna
ALTER TABLE db_name.table_name ADD [COLUMN]
{column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment']
| (column_name column_type [DEFAULT {constant|CURRENT_TIMESTAMP}|AUTO_INCREMENT] [NULL|NOT NULL] [COMMENT 'comment'],...)}
No es posible agregar columnas de clave primaria.
Ejemplo 1: Agregue una columna province de tipo VARCHAR a customer.
ALTER TABLE adb_demo.customer ADD COLUMN province VARCHAR COMMENT 'Province';
Example 2: Agregue dos columnas al mismo tiempo: vip de tipo BOOLEAN y tags de tipo VARCHAR.
ALTER TABLE adb_demo.customer ADD COLUMN (vip BOOLEAN COMMENT 'Is VIP', tags VARCHAR DEFAULT 'None' COMMENT 'Tag');
Eliminar una columna
ALTER TABLE db_name.table_name DROP [COLUMN] column_name
No es posible eliminar columnas de clave primaria.
Ejemplo: Elimine la columna province de customer.
ALTER TABLE adb_demo.customer DROP COLUMN province;
Renombrar una columna
ALTER TABLE db_name.table_name RENAME COLUMN column_name TO new_column_name
No es posible renombrar columnas de clave primaria.
Ejemplo: Cambie el nombre de city_name a city en customer.
ALTER TABLE customer RENAME COLUMN city_name TO city;
Cambiar el tipo de datos de una columna
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name new_column_type
Los cambios de tipo de datos siguen reglas de ampliación: puede expandir el rango de un tipo, pero no reducirlo. La siguiente tabla resume los cambios compatibles:
|
Cambio |
Compatible |
|
De un entero menor a uno mayor (por ejemplo, de TINYINT a BIGINT) |
Sí |
|
De un entero mayor a uno menor (por ejemplo, de BIGINT a TINYINT) |
No |
|
De FLOAT a DOUBLE |
Sí |
|
De DOUBLE a FLOAT |
No |
|
De un tipo entero a un tipo de punto flotante (FLOAT o DOUBLE) |
Sí (aplica un requisito de versión) |
|
Aumentar la precisión de DECIMAL |
Sí (aplica un requisito de versión) |
|
Reducir la precisión de DECIMAL |
No |
|
Cambio del tipo de datos de una columna de clave primaria |
No |
Cambiar un tipo entero a uno de punto flotante y aumentar la precisión de DECIMAL requiere un clúster con versión de kernel 3.1.8.10–3.1.8.x, 3.1.9.6–3.1.9.x, 3.1.10.3–3.1.10.x o 3.2.0.1 y posteriores.
Ejemplo: Cambie la columna age de INT a BIGINT.
ALTER TABLE adb_demo.customer MODIFY COLUMN age BIGINT;
Cambiar el valor predeterminado de una columna
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type DEFAULT {constant | CURRENT_TIMESTAMP}
Ejemplo 1: Establezca el valor predeterminado de sex como 0.
ALTER TABLE adb_demo.customer MODIFY COLUMN sex INT NOT NULL DEFAULT 0;
Ejemplo 2: Establezca el valor predeterminado de login_time como CURRENT_TIMESTAMP.
ALTER TABLE adb_demo.customer MODIFY COLUMN login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Permitir valores NULL
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type NULL
Solo se admiten cambios de NOT NULL a NULL. No es posible cambiar de NULL a NOT NULL.
Ejemplo: Permita que province acepte valores NULL.
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR NULL;
Modificar el comentario de una columna
ALTER TABLE db_name.table_name MODIFY [COLUMN] column_name column_type COMMENT 'new_comment'
Ejemplo: Actualice el comentario de la columna province.
ALTER TABLE adb_demo.customer MODIFY COLUMN province VARCHAR COMMENT 'The province where the customer is located';
Índices
Agregar un índice normal
De forma predeterminada, las tablas XUANWU_V2 se crean sin índices de todas las columnas (INDEX_ALL='N'), mientras que las tablas XUANWU sí los incluyen (INDEX_ALL='Y'). Agregue un índice a columnas específicas según lo requiera.
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name)
La columna debe tener un tipo de datos simple. Para columnas JSON, consulte Agregar un índice JSON.
Ejemplo: Agregue un índice a la columna age.
ALTER TABLE adb_demo.customer ADD KEY age_idx(age);
Modificar índices de todas las columnas
En las tablas XUANWU_V2, active o desactive la indexación de todas las columnas después de crear la tabla mediante la propiedad INDEX_ALL. Esta configuración no afecta los índices JSON, de texto completo ni vectoriales.
Requisitos previos
La tabla XUANWU_V2 debe estar en un clúster con versión de kernel 3.2.3.7 o posterior, o bien 3.2.4.3 o posterior.
Para consultar y actualizar la versión secundaria de su clúster, inicie sesión en la consola de AnalyticDB for MySQL y vaya a la sección Configuration Information de la página Cluster Information.
ALTER TABLE db_name.table_name INDEX_ALL = {'Y'|'N'};
|
Valor |
Efecto |
|
|
Modo de índice de todas las columnas: crea índices normales para todas las columnas. |
|
|
Modo sin índice de todas las columnas: conserva solo el índice de clave primaria y elimina todos los demás índices normales. |
Notas de uso:
En las tablas XUANWU, la indexación de todas las columnas solo se configura al momento de crear la tabla. Para deshabilitarla, elimine los índices de forma individual.
Si
INDEX_ALL='Y'y usted elimina un índice normal mediante una instrucción de lenguaje de definición de datos (DDL), la propiedad cambia automáticamente aINDEX_ALL='N'. Solo se quita el índice indicado; los demás no se ven afectados.Cuando
INDEX_ALL='N', es posible queSHOW CREATE TABLEno muestre esta propiedad de manera explícita, aunque sigue vigente.
Ejemplo 1: Deshabilite la indexación de todas las columnas en customer (actualmente con INDEX_ALL='Y').
ALTER TABLE adb_demo.customer INDEX_ALL = 'N';
Tras la ejecución, se eliminan los índices normales de las columnas que no son de clave primaria, como customer_name, city_name y sex.
Ejemplo 2: Habilite la indexación de todas las columnas en customer (actualmente con INDEX_ALL='N' e índices existentes en customer_id, phone_num y login_time).
ALTER TABLE adb_demo.customer INDEX_ALL = 'Y';
Después de la ejecución, se crean índices normales para todas las columnas que aún no cuentan con uno, como customer_name, city_name y sex.
Agregar un índice JSON
Notas de uso
El comportamiento de los índices JSON varía según el motor de la tabla:
Tablas XUANWU_V2 (particionadas y no particionadas): el índice entra en vigor de inmediato, sin necesidad de un trabajo BUILD.
Tablas XUANWU no particionadas: el índice entra en vigor únicamente cuando finaliza un trabajo BUILD.
Tablas XUANWU particionadas: desencadene manualmente un full-table BUILD job. El índice entra en vigor solo después de que termine el trabajo BUILD.
Índices JSON
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name|column_name->'$.json_path')
|
Parámetro |
Descripción |
|
|
Crea un índice en una columna JSON. La columna debe ser de tipo JSON. |
|
|
Crea un índice en una clave de propiedad específica dentro de un objeto JSON. Para más información, consulte Índices JSON. |
La sintaxis
column_name->'$.json_path'requiere la versión V3.1.6.8 o posterior del clúster. Para consultar y actualizar la versión secundaria, inicie sesión en la consola de AnalyticDB for MySQL y vaya a la sección Configuration Information de la página Cluster Information.Si una columna JSON ya tiene un índice, elimínelo antes de crear uno sobre una clave de propiedad de esa misma columna.
Ejemplo: Cree un índice JSON en la propiedad a de la columna vj.
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1,'{"a":1,"b":2}'),(2,'{"a":2,"b":3}');
ALTER TABLE json_test ADD KEY age_idx(vj->'$.a');
Índices de arreglos JSON
ALTER TABLE db_name.table_name ADD {INDEX|KEY} [index_name] (column_name->'$[*]')
column_name->'$[*]' especifica la columna de arreglo JSON que se va a indexar. Por ejemplo, vj->'$[*]' crea un índice de arreglo JSON en la columna vj.
Ejemplo: Cree un índice de arreglo JSON en la columna vj.
CREATE TABLE json_test(
id INT,
vj JSON
)
DISTRIBUTED BY HASH(id);
INSERT INTO json_test VALUES(1, '["CP-018673", 1, false]');
ALTER TABLE json_test ADD KEY index_vj(vj->'$[*]');
Eliminar un índice normal o JSON
ALTER TABLE db_name.table_name DROP KEY index_name
Ejecute SHOW INDEX FROM db_name.table_name; para obtener el nombre del índice.
Ejemplo 1: Elimine el índice age_idx de customer.
ALTER TABLE adb_demo.customer DROP KEY age_idx;
Ejemplo 2: Elimine el índice de arreglo JSON index_vj de json_test.
ALTER TABLE adb_demo.customer DROP KEY index_vj;
Agregar un índice agrupado
ALTER TABLE db_name.table_name ADD CLUSTERED [INDEX|KEY] [index_name] (column_name1 [ASC|DESC], column_name2 [ASC|DESC])
Notas de uso:
Los índices agrupados ordenan de forma ascendente (ASC) de manera predeterminada. Para cargas de trabajo que requieren orden descendente, establezca DESC al crear la tabla.
Una tabla solo admite un índice agrupado.
Después de agregar un índice agrupado, desencadene y complete un trabajo BUILD para que entre en vigor. Ejecute
SHOW CREATE TABLE db_name.table_name;para confirmarlo.
Ejemplo: Agregue un índice agrupado en customer_id.
ALTER TABLE adb_demo.customer ADD CLUSTERED KEY (customer_id ASC);
Eliminar un índice agrupado
ALTER TABLE db_name.table_name DROP CLUSTERED KEY index_name
Ejecute SHOW CREATE TABLE db_name.table_name para obtener el nombre del índice agrupado.
Ejemplo: Elimine el índice agrupado llamado index de customer.
ALTER TABLE adb_demo.customer DROP CLUSTERED KEY index;
Agregar un índice de texto completo
Requisitos previos
Un clúster de AnalyticDB for MySQL con versión V3.1.4.9 o posterior. Para obtener mejores resultados, utilice la versión V3.1.4.17 o posterior.
Para obtener información sobre cómo consultar la versión secundaria, consulte ¿Cómo consulto la versión de un clúster de AnalyticDB for MySQL?
ALTER TABLE db_name.table_name ADD FULLTEXT [INDEX|KEY] index_name (column_name) [index_option]
|
Parámetro |
Descripción |
|
|
La columna que se va a indexar. Debe ser de tipo VARCHAR. |
|
|
Opcional. Especifica el tokenizer y el diccionario personalizado. |
|
|
El analizador para el índice de texto completo. Consulte Analizadores para índices de texto completo. |
|
|
El diccionario personalizado para el índice de texto completo. Consulte Diccionarios personalizados para índices de texto completo. |
Un índice de texto completo entra en vigor únicamente después de desencadenar y completar un trabajo BUILD.
Ejemplo: Agregue un índice de texto completo a la columna home_address con el analizador standard.
ALTER TABLE adb_demo.customer ADD FULLTEXT INDEX fidx_k(home_address) WITH ANALYZER standard;
Para más información, consulte Crear un índice de texto completo.
Eliminar un índice de texto completo
ALTER TABLE db_name.table_name DROP FULLTEXT INDEX index_name
Ejemplo: Elimine el índice de texto completo fidx_k de customer.
ALTER TABLE adb_demo.customer DROP FULLTEXT INDEX fidx_k;
Agregar un índice vectorial
Requisitos previos
Un clúster de AnalyticDB for MySQL con versión V3.1.4.0 o posterior. Versiones secundarias recomendadas: 3.1.5.16, 3.1.6.8, 3.1.8.6 y posteriores.
Si su clúster no utiliza una de las versiones recomendadas, configure CSTORE_PROJECT_PUSH_DOWN y CSTORE_PPD_TOP_N_ENABLE como false antes de usar la búsqueda vectorial. Para actualizar la versión secundaria, póngase en contacto con el soporte técnico. Para obtener información sobre cómo consultar la versión secundaria, consulte ¿Cómo consulto la versión de un clúster de AnalyticDB for MySQL?
ALTER TABLE db_name.table_name ADD ANN [INDEX|KEY] [index_name] (column_name) [algorithm=HNSW_PQ] [distancemeasure=SquaredL2]
|
Parámetro |
Descripción |
|
|
El nombre del índice. Para conocer las convenciones de nomenclatura, consulte la sección Límites de nomenclatura. |
|
|
La columna vectorial que se va a indexar. El tipo de la columna debe ser |
|
|
El algoritmo utilizado para calcular la distancia vectorial. Establézcalo como |
|
|
La fórmula de distancia. Establézcala como |
Ejemplo: Cree índices vectoriales en las columnas float_feature y short_feature.
CREATE TABLE vector (
xid BIGINT NOT NULL,
cid BIGINT NOT NULL,
uid VARCHAR NOT NULL,
vid VARCHAR NOT NULL,
wid VARCHAR NOT NULL,
float_feature array<FLOAT>(4),
short_feature array<SMALLINT>(4),
PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);
ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);
Agregar una clave externa
Requisitos previos
Un clúster de AnalyticDB for MySQL con versión V3.1.10 o posterior.
Para consultar y actualizar la versión secundaria, inicie sesión en la consola de AnalyticDB for MySQL y vaya a la sección Configuration Information de la página Cluster Information.
ALTER TABLE db_name.table_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (fk_column_name) REFERENCES db_name.pk_table_name (pk_column_name)
|
Parámetro |
Descripción |
|
|
La tabla a la que se agregará la clave externa. |
|
|
Opcional. El nombre de la restricción de clave externa, que debe ser único dentro de la tabla. Si se omite, el analizador sintáctico usa |
|
|
La columna de clave externa. Ya debe existir. |
|
|
La tabla principal. Ya debe existir. |
|
|
La columna de clave primaria de la tabla principal. Ya debe existir. |
Notas de uso:
Una tabla admite varios índices de clave externa.
Un índice de clave externa no abarca varias columnas (por ejemplo, no se admite
FOREIGN KEY (sr_item_sk, sr_ticket_number)).AnalyticDB for MySQL no aplica restricciones de datos. Valide la relación de restricción entre las claves primarias y externas desde su aplicación.
No es posible agregar restricciones de clave externa a tablas externas.
Ejemplo: Agregue una clave externa en store_sales que haga referencia a la tabla item.
CREATE TABLE item
(
i_item_sk BIGINT NOT NULL,
i_current_price BIGINT,
PRIMARY KEY(i_item_sk)
)
DISTRIBUTED BY HASH(i_item_sk);
CREATE TABLE store_sales
(
ss_sale_id BIGINT,
ss_store_sk BIGINT,
ss_item_sk BIGINT NOT NULL,
PRIMARY KEY(ss_sale_id)
);
ALTER TABLE store_sales ADD CONSTRAINT ss_item_sk FOREIGN KEY (ss_item_sk) REFERENCES item (i_item_sk);
Para más información, consulte Eliminate unnecessary joins using primary and foreign key constraints.
Eliminar una clave externa
ALTER TABLE db_name.table_name DROP FOREIGN KEY fk_symbol
Ejemplo:
ALTER TABLE store_returns DROP FOREIGN KEY sr_item_sk_fk;
Particiones
Cambiar el ciclo de vida de la partición
ALTER TABLE db_name.table_name PARTITIONS N
Notas de uso:
En clústeres con versión de kernel 3.2.4.1 o posterior, establezca
Nen0para quitar la gestión del ciclo de vida de las particiones.El nuevo ciclo de vida entra en vigor únicamente después de desencadenar y completar un trabajo BUILD. Ejecute
SHOW CREATE TABLE db_name.table_name;para comprobarlo.
Ejemplo 1: Quite el ciclo de vida de customer.
ALTER TABLE customer PARTITIONS 0;
Ejemplo 2: Cambie el ciclo de vida de 30 a 40 días.
ALTER TABLE customer PARTITIONS 40;
Eliminar una partición
ALTER TABLE DROP PARTITIONtiene el mismo efecto queTRUNCATE TABLE PARTITION.
ALTER TABLE db_name.table_name DROP PARTITION (partition_name,...)
Al eliminar una partición se borran permanentemente todos los datos que contiene. Esta acción no se puede deshacer.
Ejemplo 1: elimine la partición 20241220 de customer.
ALTER TABLE adb_demo.customer DROP PARTITION (20241220);
Ejemplo 2: elimine las particiones 20241218 y 20241219.
ALTER TABLE adb_demo.customer DROP PARTITION (20241218,20241219);
Políticas de almacenamiento
Modificar la política de almacenamiento por niveles
Requisitos previos
El clúster debe ser de edición Enterprise, Basic, Data Lakehouse o Data Warehouse (modo elástico).
-
Requisitos de versión del kernel:
Tablas XUANWU: sin restricción de versión del kernel.
Tablas XUANWU_V2: la versión del kernel debe ser 3.2.2.15 o posterior, 3.2.3.13 o posterior, 3.2.4.9 o posterior, o bien 3.2.5.3 o posterior.
Para consultar y actualizar la versión secundaria, inicie sesión en la consola de AnalyticDB for MySQL y vaya a la sección Configuration Information de la página Cluster Information .
En las tablas XUANWU_V2, la tarea programada para mover datos entre el almacenamiento activo e inactivo debe estar habilitada:
-
Compruebe el estado:
SHOW ADB_CONFIG KEY=SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE;Si el resultado es
FALSE, la tarea está deshabilitada y debe habilitarla.Si se devuelve un error, el parámetro no se ha configurado y su valor predeterminado es
TRUE.
Habilite la tarea:
SET ADB_CONFIG SERVERLESS_DATA_STORAGE_CHANGE_SCHEDULE_ENABLE = true;
ALTER TABLE db_name.table_name STORAGE_POLICY= {'HOT'|'COLD'|'MIXED' hot_partition_count=N}
La nueva política de almacenamiento surte efecto únicamente después de que se active y finalice un trabajo BUILD para la tabla. De forma predeterminada, este trabajo se ejecuta automáticamente en segundo plano. Antes de que termine el trabajo BUILD, la cantidad de particiones activas que reportainformation_schema.table_usagepodría diferir de la política configurada. EjecuteSHOW CREATE TABLE db_name.table_name;para confirmar que la política ya está vigente.
Ejemplo 1: establezca la política de almacenamiento en COLD.
ALTER TABLE customer storage_policy = 'COLD';
Ejemplo 2: establezca la política de almacenamiento en HOT.
ALTER TABLE customer storage_policy = 'HOT';
Ejemplo 3: establezca la política de almacenamiento en MIXED con 10 particiones activas.
ALTER TABLE customer storage_policy = 'MIXED' hot_partition_count = 10;