如何在Clickhouse中添加列

Juh*_*uh_ 4 alter-table clickhouse

我在Clickhouse中有一个表,说“ my_table”,其中有重复项(my_table_rep1,...)。我需要添加一列float64类型的默认值(-1)。

我应该怎么做?

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

Igo*_*ist 8

该文档非常简单:

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-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 ?
????????????????????????????
Run Code Online (Sandbox Code Playgroud)

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