增强更新功能,加入删除功能,TDengine 引入重大更新

我们之前总结过时序数据的几大特点,其中包括数据极少有更新操作,数据有保留期限。所有从时序数据的特点以及处理性能出发,作为一款时序数据库(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 个参数值。

  1. UPDATE 设为 0 时,表示不允许更新数据,后发送的相同时间戳的数据会被直接丢弃;
  2. UPDATE 设为 1 时,表示更新全部列数据,即如果更新一个数据行,其中某些列没有提供取值,那么这些列会被设为 NULL;
  3. 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,还将进一步优化相关功能,敬请期待。