Добавление столбца в таблицу
Для этого мы будем использовать clickhouse-local:
clickhouse -m --output_format_pretty_row_numbers=Предположим, что у нас есть следующая таблица:
CREATE TABLE events (
date Date DEFAULT today(),
name String
)
ENGINE = MergeTree
ORDER BY date;Добавим одну запись:
INSERT INTO events (name) VALUES ('Alexey');А теперь выполните запрос к таблице events:
SELECT *
FROM events;┌───────date─┬─name───┐
│ 2024-12-18 │ Alexey │
└────────────┴────────┘Добавление нового столбца
Теперь предположим, что мы хотим добавить новый столбец с именем favoriteNumber типа Float64.
Это можно сделать с помощью предложения ALTER TABLE...ADD COLUMN:
ALTER TABLE events
ADD COLUMN favoriteNumber Float64 DEFAULT 7;Если выполнить запрос к таблице events, мы увидим следующий результат:
┌───────date─┬─name───┬─favoriteNumber─┐
│ 2024-12-18 │ Alexey │ 7 │
└────────────┴────────┴────────────────┘Для строки Alexey по умолчанию используется значение 7, поскольку на момент её добавления этого столбца ещё не существовало.
Далее добавим ещё один столбец:
INSERT INTO events (name) VALUES ('Tyler');Если выполнить запрос к таблице events, мы увидим следующий вывод:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │ 7 │
└────────────┴────────┴────────────────┘Изменение значения по умолчанию столбца
Если изменить тип столбца favoriteNumber с помощью предложения ALTER TABLE...MODIFY COLUMN, ситуация становится интереснее:
ALTER TABLE events
MODIFY COLUMN favoriteNumber Float64 DEFAULT 99;Если мы снова выполним запрос к events, то увидим такой вывод:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │ 99 │
└────────────┴────────┴────────────────┘Tyler сохраняет значение 7 — это значение по умолчанию действовало на момент создания этой строки.
Alexey получает новое значение по умолчанию 99, потому что на момент создания этой строки столбца favoriteNumber ещё не существовало.
Если мы хотим, чтобы строка Alexey сразу использовала текущее значение по умолчанию, нужно вызвать OPTIMIZE TABLE , чтобы принудительно записать текущие значения по умолчанию на диск:
OPTIMIZE TABLE events;После этого предположим, что мы снова изменим значение по умолчанию:
ALTER TABLE events
MODIFY COLUMN favoriteNumber Float64 DEFAULT 21;Затем вставьте ещё одну строку:
INSERT INTO events (name) VALUES ('Tanya');И наконец, давайте ещё раз выполним запрос к events:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ 99 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tanya │ 21 │
└────────────┴────────┴────────────────┘Tanya получает новое значение по умолчанию 21, а у Alexey остаётся старое — 99.
Управление положением столбца в таблице
Когда мы добавляем новый столбец, по умолчанию он добавляется в конец таблицы.
Но с помощью секций FIRST и AFTER можно указать, где именно будет располагаться столбец.
Например, если мы хотим добавить столбец favoriteColor после столбца name, это можно сделать так:
ALTER TABLE events
ADD COLUMN favoriteColor String DEFAULT 'Yellow' AFTER name;Выполним запрос к events:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ Yellow │ 99 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tyler │ Yellow │ 7 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tanya │ Yellow │ 21 │
└────────────┴────────┴───────────────┴────────────────┘Если мы хотим добавить столбец favoriteDatabase и сделать его первым в списке, можно сделать так:
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 │
└──────────────────┴────────────┴────────┴───────────────┴────────────────┘Давайте посмотрим на определение таблицы:
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