テーブルにカラムを追加する
clickhouse-local を使用します。
clickhouse -m --output_format_pretty_row_numbers=次のようなテーブルがあるとします。
CREATE TABLE events (
date Date DEFAULT today(),
name String
)
ENGINE = MergeTree
ORDER BY date;レコードを1件追加しましょう:
INSERT INTO events (name) VALUES ('Alexey');次に、events テーブルに対してクエリを実行します:
SELECT *
FROM events;┌───────date─┬─name───┐
│ 2024-12-18 │ Alexey │
└────────────┴────────┘新しいカラムの追加
ここで、Float64 型の favoriteNumber という新しいカラムを追加することにします。
これは 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 │
└────────────┴────────┴────────────────┘カラムのデフォルト値の変更
ALTER TABLE...MODIFY COLUMN 句を使って favoriteNumber カラムを別の型に変更すると、少し複雑な挙動になります。
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 句を使うことで、カラムを配置する位置を指定できます。
たとえば、name カラムの後に favoriteColor という名前のカラムを追加する場合は、次のようにします。
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