1、INSERT+Final方式
这种方法需要ReplacingMergeTree表引擎配置使用
sql
CREATE TABLE tb_test_replacing(
ts DateTime,
uid String,
biz String
) ENGINE = ReplacingMergeTree(ts) ORDER BY (ts) SETTINGS index_granularity = 8192;
INSERT INTO tb_test_replacing VALUES ('2019-06-07 20:01:01', 'c', 'c1');
这种方式就不用执行alter了,而是以insert的形式来代替alter操作,即每次select时都是取最新的一条数据,sql语句如下
sql
INSERT INTO tb_test_replacing VALUES ('2019-06-07 20:01:01', 'c', 'c2');
此时查询该表,发现还是两条数据,并没有实现更新
sql
SELECT *
FROM tb_test_replacing
Query id: 02cfecf5-18f1-4f9f-ad55-e7b596935de8
┌──────────────────ts─┬─uid─┬─biz─┐
│ 2019-06-07 20:01:01 │ c │ c2 │
└─────────────────────┴─────┴─────┘
┌──────────────────ts─┬─uid─┬─biz─┐
│ 2019-06-07 20:01:01 │ c │ c1 │
└─────────────────────┴─────┴─────┘
2 rows in set. Elapsed: 0.004 sec.
在sql后面加上final,发现只返回了最新的一条,是符合预期的
sql
SELECT *
FROM tb_test_replacing
FINAL
Query id: 614c7e93-48c2-4129-a734-c8a0dd722fcd
┌──────────────────ts─┬─uid─┬─biz─┐
│ 2019-06-07 20:01:01 │ c │ c2 │
└─────────────────────┴─────┴─────┘
1 rows in set. Elapsed: 0.007 sec.
注意:ReplacingMergeTree在建表时可以看到ENGINE = ReplacingMergeTree(ts),其中的ts就是版本信息,clickhouse会每次插入记录版本,就是依据这个字段,在查询时会返回最后最新的版本数据。所以第二个insert的ts和第一个insert的ts字段的值一样,所以会以第二条记录为准,即实现了更新。具体用法见:ReplacingMergeTree