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

相关推荐
Ljw...4 分钟前
索引(MySQL)
数据库·mysql·索引
菠萝咕噜肉i18 分钟前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
长风清留扬20 分钟前
一篇文章了解何为 “大数据治理“ 理论与实践
大数据·数据库·面试·数据治理
OpsEye33 分钟前
MySQL 8.0.40版本自动升级异常的预警提示
数据库·mysql·数据库升级
Ljw...33 分钟前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
远歌已逝4 小时前
维护在线重做日志(二)
数据库·oracle
qq_433099405 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz5 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺7 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了8 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring