我们之前总结过时序数据的几大特点,其中包括数据极少有更新操作,数据有保留期限。所有从时序数据的特点以及处理性能出发,作为一款时序数据库(Time-Series Database),TDengine 最初并没有提供更新和删除功能,用户可以指定数据的保留期限,系统会自动删除到期数据,以节省存储空间。
不过随着 TDengine 的应用越来越广泛,有些应用场景下,很多客户提出了更新数据的需求,比如:
“如果仪表上报的历史数据中,有些数据存在跳转不准,TDengine 支持更新操作吗?”
“我们的应用在采集或通信中断的时候,有脏数据存在,该如何处理?”
所以从 TDengine 2.0.8.0 版本开始,我们正式推出了数据更新功能。
近来,还有些客户提出了删除数据的需求,比如:
“如果因为绑定关系变化,数据被写入了错误的表,该如何处理?”
为满足这些客户的需求,TDengine 2.6 企业版又提供了数据删除功能。
下面分别来看一下这两大功能。
更新(UPDATE)
从 2.0.8.0 版本开始,TDengine 引入了 UPDATE 参数,正式支持更新写入的数据。从 2.1.7.0 版本开始,我们又进一步增强了该功能。目前它支持 0/1/2 这 3 个参数值。
- UPDATE 设为 0 时,表示不允许更新数据,后发送的相同时间戳的数据会被直接丢弃;
- UPDATE 设为 1 时,表示更新全部列数据,即如果更新一个数据行,其中某些列没有提供取值,那么这些列会被设为 NULL;
- UPDATE 设为 2 时,表示支持更新部分列数据,即如果更新一个数据行,其中某些列没有提供取值,那么这些列会保持原有数据行中的对应值。
要使用更新功能,则需要在创建数据库时使用 UPDATE 参数,将其设置为 1 或 2。之后就可以使用 INSERT INTO 命令更新已经写入的相同时间戳数据了。
删除(DELETE)
DELETE 功能简单易学,只需要一条 SQL 语句。
DELETE FROM [ db_name. ] tb_name [WHERE condition];
熟悉 Database 的朋友肯定一看就懂,其功能就是删除指定表或超级表中的数据记录。
我们再来分别看一下这里的几个参数。
db_name
: 可选参数,指定要删除表所在的数据库名,默认为当前数据库。
tb_name
: 必填参数,指定要删除数据的表名,可以是普通表、子表,也可以是超级表。
condition
: 可选参数,指定删除数据的过滤条件,不指定过滤条件则为表中所有数据,请慎重使用。特别说明,这里的 where 条件中只支持对第一列时间列的过滤,如果是超级表,支持对 tag 列过滤。
下面看个例子。
假设 meters
是一个超级表,groupid
是 int 类型的 tag 列,现在要删除 meters
表中时间小于 2021-10-01 10:40:00.100 且 tag 列 groupid
值为 1 的所有数据,实现该功能的 SQL 如下:
delete from meters where ts < '2021-10-01 10:40:00.100' and groupid=1 ;
执行该语句,结果为:
Deleted 102000 row(s) from 1020 table(s) (0.421950s)
它表示从 1020 个子表中共删除了 102000 行数据。
如果你的业务中有删除指定数据的需求,欢迎联系我们,试用体验 TDengine 企业版本!
正在开发的 TDengine 3.0,还将进一步优化相关功能,敬请期待。