如何在ClickHouse中添加列

6

我在clickhouse中有一张表,名为"my_table",其中包含副本(my_table_rep1,...)。现在我需要添加一个名为float64的列,其默认值为(-1)。

应该如何操作呢?

最好不要将默认值添加到现有条目中。

1个回答

17

文档相当直观:

ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after]

关于这点:

我希望默认值实际上不会添加到现有条目中。

文档中还有一句话:

如果您向表中添加了一个新列,但稍后更改了其默认值表达式,则旧数据使用的值将更改(对于未存储在磁盘上的值)。

因此,基本上你需要:

  1. 添加一个列(没有默认值,或者使用 DEFAULT 0 或其他内容——取决于您想在现有条目中拥有什么)
  2. 执行 OPTIMIZE TABLE .. FINAL 强制 Clickhouse 将新数据写入磁盘
  3. 修改列并设置 DEFAULT -1,以便只影响新行

以下是一个例子:

 :) CREATE TABLE my_table (date Date DEFAULT today(), s String) ENGINE = MergeTree(date, (date), 8192);

 :) INSERT INTO my_table (s) VALUES ('1. foo');

 :) ALTER TABLE my_table ADD COLUMN f Float64;

 :) INSERT INTO my_table (s) VALUES ('2. bar');

 :) SELECT * FROM my_table;

┌───────date─┬─s──────┬─f─┐
│ 2018-04-201. foo │ 0 │
│ 2018-04-202. bar │ 0 │
└────────────┴────────┴───┘

 :) OPTIMIZE TABLE my_table PARTITION 201804 FINAL;

 :) ALTER TABLE my_table MODIFY COLUMN f Float64 DEFAULT -1;

 :) INSERT INTO my_table (s) VALUES ('3. baz');

 :) SELECT * FROM my_table;

┌───────date─┬─s──────┬──f─┐
│ 2018-04-203. baz │ -1 │
│ 2018-04-201. foo │  0 │
│ 2018-04-202. bar │  0 │
└────────────┴────────┴────┘

你真的需要执行OPTIMIZE TABLE ... FINAL,因为如果你不这样做,奇怪的事情就会发生:https://gist.github.com/hatarist/5e7653808e59349c34d4589b2fc69b14


1
是否有像"ADD COLUMN IF NOT EXIST"这样的东西? - crak
@crak查看了文档,似乎没有;请随意发布功能请求!https://github.com/yandex/ClickHouse/issues/new - Igor Hatarist
1
现在,ALTER COLUMN 命令支持检查列是否存在:ADD COLUMN [IF NOT EXISTS] name [type] [default_expr] [codec] [AFTER name_after | FIRST]文档 - Jarrod Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接