Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

向表中添加列

向表中添加一列

我们将使用 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
Navigation