如何在clickhouse中添加列

swvgeqrz  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(1857)

我在clickhouse中有一个表,比如说“my_table”,它有副本(my_table_rep1,…)。我需要添加一个float64类型的列,默认值为(-1)。
我该怎么做?
我更希望默认值不会实际添加到现有条目中。

tjvv9vkg

tjvv9vkg1#

文档非常直接: ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after] 关于这一点:
我更希望默认值不会实际添加到现有条目中。
文件中还有一句话:
如果向表中添加新列,但随后更改其默认表达式,则用于旧数据的值将更改(对于未在磁盘上存储值的数据)
所以,基本上,你必须:
添加列(没有默认值,或 DEFAULT 0 ,或其他内容-取决于您希望在现有条目中包含的内容)
OPTIMIZE TABLE .. FINAL 强制clickhouse将新数据写入磁盘
修改列并设置默认值-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

相关问题