Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Añadir una columna a una tabla

Agregar una columna a una tabla

Usaremos clickhouse-local:

clickhouse -m --output_format_pretty_row_numbers=

Imaginemos que tenemos la siguiente tabla:

CREATE TABLE events (
    date Date DEFAULT today(), 
    name String
) 
ENGINE = MergeTree
ORDER BY date;

Añadamos un registro:

INSERT INTO events (name) VALUES ('Alexey');

Y ahora, consulta la tabla events:

SELECT *
FROM events;
┌───────date─┬─name───┐
│ 2024-12-18 │ Alexey │
└────────────┴────────┘

Añadir una nueva columna

Supongamos ahora que vamos a añadir una nueva columna llamada favoriteNumber, que será de tipo Float64. Podemos hacerlo con la cláusula ALTER TABLE...ADD COLUMN:

ALTER TABLE events 
ADD COLUMN favoriteNumber Float64 DEFAULT 7;

Si consultamos la tabla events, veremos la siguiente salida:

┌───────date─┬─name───┬─favoriteNumber─┐
│ 2024-12-18 │ Alexey │              7 │
└────────────┴────────┴────────────────┘

La fila Alexey tiene por defecto el valor 7, ya que esa columna no existía cuando añadimos esa fila. A continuación, añadamos otra columna:

INSERT INTO events (name) VALUES ('Tyler');

Si consultamos la tabla events, veremos la siguiente salida:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler  │              7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │              7 │
└────────────┴────────┴────────────────┘

Modificar el valor predeterminado de una columna

Si modificamos la columna favoriteNumber para que tenga un tipo diferente mediante la cláusula ALTER TABLE...MODIFY COLUMN, la cosa se pone interesante:

ALTER TABLE events 
MODIFY COLUMN favoriteNumber Float64 DEFAULT 99;

Si volvemos a consultar events, veremos este resultado:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler  │              7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │             99 │
└────────────┴────────┴────────────────┘

Tyler conserva el valor 7, que era el predeterminado cuando se creó esa fila. Alexey toma el nuevo valor predeterminado, 99, porque la columna favoriteNumber no existía cuando se creó esa fila.

Si queremos que la fila de Alexey use de inmediato el valor predeterminado actual, debemos llamar a OPTIMIZE TABLE para forzar que los valores predeterminados actuales se escriban en disco:

OPTIMIZE TABLE events;

Una vez hecho eso, supongamos que volvemos a cambiar el valor predeterminado:

ALTER TABLE events 
MODIFY COLUMN favoriteNumber Float64 DEFAULT 21;

Y luego inserte otra fila:

INSERT INTO events (name) VALUES ('Tanya');

Por último, consultemos events una vez más:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │             99 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tyler  │              7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tanya  │             21 │
└────────────┴────────┴────────────────┘

Tanya adopta el nuevo valor predeterminado de 21, pero Alexey conserva el valor predeterminado anterior de 99.

Controlar la posición de una columna en la tabla

Cuando agregamos una nueva columna, de forma predeterminada se añadirá al final de la tabla. Pero podemos usar las cláusulas FIRST y AFTER para controlar en qué posición se coloca una columna.

Por ejemplo, si quisiéramos agregar una columna llamada favoriteColor después de la columna name, podríamos hacerlo así:

ALTER TABLE events
ADD COLUMN favoriteColor String DEFAULT 'Yellow' AFTER name;

Consultemos events:

┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃       date ┃ name   ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ Yellow        │             99 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tyler  │ Yellow        │              7 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tanya  │ Yellow        │             21 │
└────────────┴────────┴───────────────┴────────────────┘

Y, si quisiéramos añadir una columna favoriteDatabase y hacer que apareciera primero en la lista, podríamos hacerlo así:

ALTER TABLE events
ADD COLUMN favoriteDatabase String DEFAULT 'ClickHouse' FIRST;
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ favoriteDatabase ┃       date ┃ name   ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ ClickHouse       │ 2024-12-18 │ Tanya  │ Yellow        │             21 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse       │ 2024-12-18 │ Alexey │ Yellow        │             99 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse       │ 2024-12-18 │ Tyler  │ Yellow        │              7 │
└──────────────────┴────────────┴────────┴───────────────┴────────────────┘

Y veamos la definición de la tabla:

SHOW CREATE TABLE events
FORMAT LineAsString
CREATE TABLE default.`clickhouse-local-ab404c86-56cc-495b-ad1d-fb343cac3bc0events`
(
    `favoriteDatabase` String DEFAULT 'ClickHouse',
    `date` Date DEFAULT today(),
    `name` String,
    `favoriteColor` String DEFAULT 'Yellow',
    `favoriteNumber` Float64 DEFAULT 21
)
ENGINE = MergeTree
ORDER BY date
Navigation