- ADD COLUMN — Agrega una nueva columna a la tabla.
- DROP COLUMN — Elimina la columna.
- RENAME COLUMN — Cambia el nombre de una columna existente.
- CLEAR COLUMN — Restablece los valores de la columna.
- COMMENT COLUMN — Agrega un comentario de texto a la columna.
- MODIFY COLUMN — Cambia el tipo de la columna, la expresión predeterminada, el TTL y la configuración de la columna.
- MODIFY COLUMN REMOVE — Elimina una de las propiedades de la columna.
- MODIFY COLUMN MODIFY SETTING - Cambia la configuración de la columna.
- MODIFY COLUMN RESET SETTING - Restablece la configuración de la columna.
- MATERIALIZE COLUMN — Materializa la columna en las partes donde no existe. Estas acciones se describen en detalle a continuación.
ADD COLUMN
name, type, codec y default_expr especificados (consulte la sección Expresiones predeterminadas).
Si se incluye la cláusula IF NOT EXISTS, la consulta no devolverá ningún error si la columna ya existe. Si especifica AFTER name_after (el nombre de otra columna), la columna se agrega después de la indicada en la lista de columnas de la tabla. Si quiere agregar una columna al principio de la tabla, use la cláusula FIRST. De lo contrario, la columna se agrega al final de la tabla. En una cadena de acciones, name_after puede ser el nombre de una columna que se agrega en una de las acciones anteriores.
Agregar una columna solo cambia la estructura de la tabla, sin realizar ninguna acción sobre los datos. Los datos no se guardan en disco después de ALTER. Si faltan datos para una columna al leer la tabla, se completan con valores predeterminados (ejecutando la expresión predeterminada si existe, o usando ceros o cadenas vacías). La columna aparece en disco después de fusionar las partes de datos (consulte MergeTree).
Este enfoque permite completar la consulta ALTER al instante, sin aumentar el volumen de los datos antiguos.
Ejemplo:
DROP COLUMN
name. Si se especifica la cláusula IF EXISTS, la consulta no devolverá ningún error si la columna no existe.
Elimina datos del sistema de archivos. Como esto elimina archivos completos, la consulta se completa casi al instante.
Ejemplo:
RENAME COLUMN
name a new_name. Si se especifica la cláusula IF EXISTS, la consulta no devolverá un error si la columna no existe. Como el cambio de nombre no afecta a los datos subyacentes, la consulta se completa casi al instante.
NOTA: Las columnas especificadas en la expresión de clave de la tabla (ya sea con ORDER BY o PRIMARY KEY) no se pueden renombrar. Si se intenta cambiar estas columnas, se producirá SQL Error [524].
Ejemplo:
CLEAR COLUMN
IF EXISTS, la consulta no devolverá ningún error si la columna no existe.
Ejemplo:
COMMENT COLUMN
IF EXISTS, la consulta no devolverá ningún error si la columna no existe.
Cada columna puede tener un solo comentario. Si la columna ya tiene un comentario, el nuevo comentario sobrescribe el anterior.
Los comentarios se almacenan en la columna comment_expression que devuelve la consulta DESCRIBE TABLE.
Ejemplo:
MODIFY COLUMN
name:
- Tipo
- Expresión predeterminada
- Códec de compresión
- TTL
- Configuración a nivel de columna
IF EXISTS, la consulta no devolverá un error si la columna no existe.
Al cambiar el tipo, los valores se convierten como si se les hubieran aplicado las funciones toType. Si solo se cambia la expresión predeterminada, la consulta no realiza ninguna operación compleja y se completa casi al instante.
Ejemplo:
FIRST | AFTER; consulta la descripción de ADD COLUMN, aunque en este caso el tipo de columna es obligatorio.
Ejemplo:
ALTER es atómica. En las tablas MergeTree, tampoco requiere bloqueos.
La consulta ALTER para cambiar columnas se replica. Las instrucciones se guardan en ZooKeeper y luego cada réplica las aplica. Todas las consultas ALTER se ejecutan en el mismo orden. La consulta espera a que se completen las acciones correspondientes en las otras réplicas. Sin embargo, una consulta para cambiar columnas en una tabla replicada puede interrumpirse, y todas las acciones se realizarán de forma asíncrona.
Tenga mucho cuidado al cambiar una columna Nullable a Non-Nullable. Asegúrese de que no tenga ningún valor NULL; de lo contrario, causará problemas al leerla. En ese caso, la solución alternativa sería ejecutar Kill sobre la mutación y revertir la columna al tipo Nullable.
MODIFY COLUMN REMOVE
DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS.
Sintaxis:
MODIFY COLUMN MODIFY SETTING
max_compress_block_size de la columna a 1MB:
MODIFY COLUMN RESET SETTING
max_compress_block_size a su valor por defecto:
MATERIALIZE COLUMN
DEFAULT o MATERIALIZED. Al añadir una columna materializada mediante ALTER TABLE table_name ADD COLUMN column_name MATERIALIZED, las filas existentes sin valores materializados no se rellenan automáticamente. La sentencia MATERIALIZE COLUMN puede usarse para reescribir los datos existentes de la columna después de añadir o actualizar una expresión DEFAULT o MATERIALIZED (lo que solo actualiza los metadatos, pero no modifica los datos existentes). Tenga en cuenta que materializar una columna en la clave de ordenación es una operación no válida porque podría alterar el orden de clasificación.
Se implementa como una mutación.
En las columnas con una expresión de valor MATERIALIZED nueva o actualizada, se reescriben todas las filas existentes.
En las columnas con una expresión de valor DEFAULT nueva o actualizada, el comportamiento depende de la versión de ClickHouse:
- En ClickHouse < v24.2, se reescriben todas las filas existentes.
- ClickHouse >= v24.2 distingue si el valor de una fila en una columna con una expresión de valor
DEFAULTse especificó explícitamente al insertarla o no; es decir, si se calculó a partir de la expresión de valorDEFAULT. Si el valor se especificó explícitamente, ClickHouse lo mantiene tal cual. Si el valor se calculó, ClickHouse lo cambia por la expresión de valorMATERIALIZEDnueva o actualizada.
- Si especifica una PARTITION, solo se materializará una columna con la partición especificada.
Limitaciones
ALTER permite crear y eliminar elementos individuales (columnas) en estructuras de datos anidadas, pero no estructuras de datos anidadas completas. Para añadir una estructura de datos anidada, puede añadir columnas con un nombre como name.nested_name y el tipo Array(T). Una estructura de datos anidada equivale a varias columnas de array cuyo nombre comparte el mismo prefijo antes del punto.
El cambio de nombre de columnas con puntos en sus nombres tiene compatibilidad parcial. Los puntos están reservados para el acceso a sub-columnas Nested, por lo que el prefijo (nombre padre) debe permanecer igual. Solo se puede cambiar el sufijo (nombre de la sub-columna). Por ejemplo, a.b puede renombrarse a a.c, pero no se permite renombrar a.b a b.d porque cambia el prefijo padre de Nested.
No se admite la eliminación de columnas de la clave primaria o de la clave de muestreo (columnas que se usan en la expresión ENGINE). Cambiar el tipo de las columnas incluidas en la clave primaria solo es posible si este cambio no modifica los datos (por ejemplo, se permite añadir valores a un Enum o cambiar un tipo de DateTime a UInt32).
Si la consulta ALTER no es suficiente para realizar los cambios de tabla que necesita, puede crear una tabla nueva, copiar los datos en ella mediante la consulta INSERT SELECT, luego intercambiar las tablas con la consulta RENAME y eliminar la tabla antigua.
La consulta ALTER bloquea todas las lecturas y escrituras de la tabla. En otras palabras, si se está ejecutando un SELECT largo en el momento de la consulta ALTER, la consulta ALTER esperará a que finalice. Al mismo tiempo, todas las consultas nuevas a la misma tabla quedarán en espera mientras este ALTER se esté ejecutando.
En las tablas que no almacenan datos por sí mismas (como Merge y Distributed), ALTER solo cambia la estructura de la tabla y no la estructura de las tablas subordinadas. Por ejemplo, al ejecutar ALTER para una tabla Distributed, también tendrá que ejecutar ALTER para las tablas en todos los servidores remotos.