我会依靠数组函数来使行为可预测。
备注:
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);