向表中添加列
·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。
控制表中的列位置
当我们添加新列时,默认情况下它将被添加到表的末尾。但是,我们可以使用 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 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