Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Como adicionar uma coluna a uma tabela

Adicionando uma coluna a uma tabela

Vamos usar o clickhouse-local:

clickhouse -m --output_format_pretty_row_numbers=

Vamos imaginar a seguinte tabela:

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

Vamos adicionar um registro:

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

E agora consulte a tabela events:

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

Adicionando uma nova coluna

Agora, vamos supor que vamos adicionar uma nova coluna chamada favoriteNumber, que será do tipo Float64. Podemos fazer isso usando a cláusula ALTER TABLE...ADD COLUMN:

ALTER TABLE events 
ADD COLUMN favoriteNumber Float64 DEFAULT 7;

Se consultarmos a tabela events, veremos a seguinte saída:

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

A linha Alexey fica com o valor padrão 7, pois essa coluna não existia quando adicionamos essa linha. Em seguida, vamos adicionar outra coluna:

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

Se consultarmos a tabela events, veremos a seguinte saída:

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

Modificando o valor padrão de uma coluna

Se modificarmos a coluna favoriteNumber para usar um tipo diferente com a cláusula ALTER TABLE...MODIFY COLUMN, a coisa fica interessante:

ALTER TABLE events 
MODIFY COLUMN favoriteNumber Float64 DEFAULT 99;

Se fizermos outra consulta em events, veremos esta saída:

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

Tyler mantém o valor 7, que era o padrão quando essa linha foi criada. Alexey passa a usar o novo padrão de 99 porque a coluna favoriteNumber não existia quando essa linha foi criada.

Se quisermos que a linha de Alexey use o padrão atual imediatamente, precisamos chamar OPTIMIZE TABLE para forçar a gravação dos padrões atuais em disco:

OPTIMIZE TABLE events;

Depois de fazer isso, suponha que alteremos o valor padrão novamente:

ALTER TABLE events 
MODIFY COLUMN favoriteNumber Float64 DEFAULT 21;

Em seguida, insira outra linha:

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

Por fim, vamos consultar events mais uma vez:

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

Tanya assume o novo valor padrão de 21, mas Alexey fica com o valor padrão antigo de 99.

Controlando a posição da coluna na tabela

Quando adicionamos uma nova coluna, por padrão ela é adicionada ao final da tabela. Mas podemos usar as cláusulas FIRST e AFTER para controlar onde a coluna será posicionada.

Por exemplo, se quisermos adicionar uma coluna chamada favoriteColor após a coluna name, podemos fazer isso:

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

Vamos consultar events:

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

E, se quiséssemos adicionar uma coluna favoriteDatabase e fazer com que ela ficasse em primeiro lugar na lista, poderíamos fazer isso:

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 │
└──────────────────┴────────────┴────────┴───────────────┴────────────────┘

E vamos ver a definição da tabela:

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