Clickhouse之更新表(ReplacingMergeTree)

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

相关推荐
我不会插花弄玉几秒前
8. 复合查询【由浅入深-MySQL】
android·数据库·mysql
北风toto8 分钟前
数据库模式分解:如何判定“保持函数依赖”?
数据库
极限挑战哥1 小时前
深度拆解团购多商户分账系统:规则引擎 + 账户体系 + 逆向清算全解析
网络·数据库·人工智能
数据狐(Datafox)1 小时前
一文读懂京东商品详情 API:返回字段解读与 JSON 样例
开发语言·数据库·爬虫·json
zyseo81 小时前
谷歌SEO 抓取日志分析脚本:解析访问日志,看穿 Googlebot 的抓取行为
大数据·数据库·搜索引擎·自动化
ai大模型-探索者2 小时前
Milvus向量数据库(介绍与使用)
数据库·milvus
minglie12 小时前
zynq联网配置
网络·数据库·php
花间相见2 小时前
【计算基础|MySQL08】索引(上):为什么是 B+ 树
数据结构·mysql·算法·架构
小羊没烦恼!2 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#