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

相关推荐
·云扬·1 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql
用户982863025681 小时前
pg内核实现细节
数据库
码界筑梦坊1 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
飞升不如收破烂~1 小时前
Redis 分布式锁+接口幂等性使用+当下流行的限流方案「落地实操」+用户连续点击两下按钮的解决方案自用总结
数据库·redis·分布式
workflower1 小时前
业务需求-假设场景
java·数据库·测试用例·集成测试·需求分析·模块测试·软件需求
亓才孓1 小时前
[JDBC]基于三层架构和MVC架构的JDBCTools
数据库
IT邦德2 小时前
RPM包快速安装Oracle26ai
数据库·oracle
Dovis(誓平步青云)2 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
mr_LuoWei20092 小时前
python工具:python代码知识库笔记
数据库·python
这周也會开心2 小时前
Redis数据类型的底层实现和数据持久化
数据库·redis·缓存