【问题标题】:Clickhouse calculate autoincrementClickhouse 计算自动增量
【发布时间】:2020-08-04 13:26:22
【问题描述】:

存在带有整数标识符列的旧表。

尝试重现自动增量:

INSERT legacy_table (id, name)
SELECT
    (SELECT max(id) FROM legacy_table) + rowNumberInAllBlocks() id,
    name
FROM other_table

问题是SELECT max(id) FROM legacy_table 只计算一次,会产生重复。

是否可以每行执行SELECT max(id) 或其他自动增量解决方案?

【问题讨论】:

标签: clickhouse


【解决方案1】:

我会依靠数组函数来使行为可预测。

备注:

  • 不应将任何外部插入到目标表和源表中

  • 一次应该只运行一个脚本(所以不要将它应用于分布式表,而是在每个分片上顺序执行)

  • 对于大表,嵌套查询可能会失败,所以添加 WHERE 子句来限制处理数据的计数是有意义的

INSERT INTO target
SELECT result.1 AS id, result.2 AS name
FROM (
  WITH (SELECT max(id) FROM target) AS target_table_max_id
  SELECT 
    groupArray((id, name)) origin_data,
    arrayMap((origin_row, row_index) -> (target_table_max_id + row_index, origin_row.2), 
      origin_data, 
      arrayEnumerate(origin_data)) origin_data_updated,
    arrayJoin(origin_data_updated) result
  FROM origin);

准备测试环境的脚本:

# prepare test tables
CREATE TABLE target (`id` Int32, `name` String) ENGINE = Memory;
CREATE TABLE origin (`id` Int32, `name` String) ENGINE = Memory; 

# fill test tables 
INSERT INTO target 
SELECT  number AS id, toString(id) AS name
FROM numbers(8);

INSERT INTO origin 
SELECT number + 2048 AS id, toString(id) AS name
FROM numbers(4);

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 2019-03-20
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多