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

相关推荐
2401_854391081 分钟前
Spring Boot框架下租房管理系统的设计与实现
数据库·spring boot·php
2401_857617625 分钟前
Spring Boot框架在中小企业设备管理中的创新应用
数据库·spring boot·后端
会飞的土拨鼠呀12 分钟前
Centos7.9安装MySQL(二进制)
android·数据库·mysql
白总Server14 分钟前
Gateway解说
服务器·网络·数据库·web安全·架构·php·idc
激流丶17 分钟前
【Mysql 深入探索】InnoDB 实现事务的机制
数据库·mysql·innodb
优维科技EasyOps26 分钟前
MongoDB 8.0 全新登场:究竟如何?
数据库·mongodb
hangbobo26 分钟前
监测mongodb服务并启动
数据库·mongodb
小黑哪有坏心思!1 小时前
Linux安装部署数据库:MongoDB
linux·运维·数据库·mongodb·nosql
搬码后生仔1 小时前
在 Windows 系统上设置 MySQL8.0以支持远程连接
数据库
菠萝加点糖1 小时前
ADB指定进程名称kill进程
数据库·adb