向表中添加列
·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