跳到主要内容

向表中添加列

·4 分钟阅读
在本指南中,我们将学习如何向现有表添加列。

向表中添加列

我们将使用 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 │
└────────────┴────────┴────────────────┘

修改列的默认值

如果我们使用 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

控制表中的列位置

当我们添加新列时,默认情况下它将被添加到表的末尾。但是,我们可以使用 FIRSTAFTER 子句来控制列的位置。

例如,如果我们想在 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 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
SETTINGS index_granularity = 8192