6

我在 clickhouse 中有一张桌子,说“my_table”,它有复制品(my_table_rep1,...)。我需要添加一列,类型为 float64,默认值为 (-1)。

我该怎么做?

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

4

1 回答 1

14

文档非常简单:

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

对此:

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

文档中还有一个声明:

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

所以,基本上,你必须:

  1. 添加一列(没有默认值,或使用DEFAULT 0,或使用其他内容 - 取决于您希望在现有条目中拥有什么)
  2. 强制ClickhouseOPTIMIZE TABLE .. FINAL将新数据写入磁盘
  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-20 │ 1. foo │ 0 │
│ 2018-04-20 │ 2. 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-20 │ 3. baz │ -1 │
│ 2018-04-20 │ 1. foo │  0 │
│ 2018-04-20 │ 2. bar │  0 │
└────────────┴────────┴────┘

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

于 2018-04-20T23:50:54.070 回答