我在clickhouse中有一个表,比如说“my_table”,它有副本(my_table_rep1,…)。我需要添加一个float64类型的列,默认值为(-1)。我该怎么做?我更希望默认值不会实际添加到现有条目中。
tjvv9vkg1#
文档非常直接: ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after] 关于这一点:我更希望默认值不会实际添加到现有条目中。文件中还有一句话:如果向表中添加新列,但随后更改其默认表达式,则用于旧数据的值将更改(对于未在磁盘上存储值的数据)所以,基本上,你必须:添加列(没有默认值,或 DEFAULT 0 ,或其他内容-取决于您希望在现有条目中包含的内容)做 OPTIMIZE TABLE .. FINAL 强制clickhouse将新数据写入磁盘修改列并设置默认值-1,这样只有新行会受到影响举个例子:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after]
DEFAULT 0
OPTIMIZE TABLE .. FINAL
:) 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
OPTIMIZE TABLE ... FULL
1条答案
按热度按时间tjvv9vkg1#
文档非常直接:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD COLUMN name [type] [default_expr] [AFTER name_after]
关于这一点:我更希望默认值不会实际添加到现有条目中。
文件中还有一句话:
如果向表中添加新列,但随后更改其默认表达式,则用于旧数据的值将更改(对于未在磁盘上存储值的数据)
所以,基本上,你必须:
添加列(没有默认值,或
DEFAULT 0
,或其他内容-取决于您希望在现有条目中包含的内容)做
OPTIMIZE TABLE .. FINAL
强制clickhouse将新数据写入磁盘修改列并设置默认值-1,这样只有新行会受到影响
举个例子:
你真的必须这么做
OPTIMIZE TABLE ... FULL
,因为如果你不这么做,奇怪的事情就会发生:https://gist.github.com/hatarist/5e7653808e59349c34d4589b2fc69b14