跳至主要内容

向表中添加列

在本指南中,我们将学习如何向现有表中添加列。

向表中添加列

我们将使用 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
·阅读时间:4 分钟
    © . This site is unofficial and not affiliated with ClickHouse, Inc.