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 LineAsStringCREATE 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