gpt4 book ai didi

alter-table - 如何在clickhouse中添加一列

转载 作者:行者123 更新时间:2023-12-04 23:13:17 76 4
gpt4 key购买 nike

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

我该怎么做?

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

最佳答案

documentation非常直接:

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



对此:

I would prefer that the default are not actually added to existing entries.



文档中还有一个声明:

If you add a new column to a table but later change its default expression, the values used for old data will change (for data where values were not stored on the disk)



所以,基本上,你必须:
  • 添加一列(没有默认值,或使用 DEFAULT 0 或其他内容 - 取决于您希望在现有条目中包含什么)
  • OPTIMIZE TABLE .. FINAL强制 Clickhouse 将新数据写入磁盘
  • 修改列并设置 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

    关于alter-table - 如何在clickhouse中添加一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944865/

    76 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com