TDengine 基础功能——数据写入

本章以智能电表的数据模型为例介绍如何在 TDengine 中使用 SQL 来写入、更新、删除时序数据。

写入

在 TDengine 中,用户可以使用 SQL 的 insert 语句写入时序数据。

一次写入一条

假设设备 ID 为 d1001 的智能电表在 2018 年 10 月 3 日 14:38:05 采集到数据:电流 10.3A,电压 219V,相位 0.31。在 power 数据库中创建了属于超级表 meters 的子表 d1001 后,可以通过下面的 insert 语句在子表 d1001 中写入时序数据。

  1. 可以通过下面的 INSERT 语句向子表 d1001 中写入时序数据。
sql 复制代码
insert into d1001 (ts, current, voltage, phase) values ( "2018-10-03 14:38:05", 10.3, 219, 0.31)

上面的 SQL 向子表 d1001ts, current, voltage, phase 这 4 列分别写入 2018-10-03 14:38:05, 10.3, 219, 0.31

  1. INSERT 语句中的 VALUES 部分包含了表的所有列时,可以省略 VALUES 前的字段列表,如下面的 SQL 语句所示,其与前面指定列的 INSERT 语句,效果完全一样。
sql 复制代码
insert into d1001 values("2018-10-03 14:38:05", 10.3, 219, 0.31)
  1. 对于表的时间戳列(第一列),也可以直接使用数据库精度的时间戳。
sql 复制代码
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);

以上三种 SQL 的效果完全相同。

一次写入多条

假设设备 ID 为 d1001 的智能电表每 10s 采集一次数据,每 30s 上报一次数据,即每 30s 需要写入 3 条数据。用户可以在一条 insert 语句中写入多条记录。如下 SQL 一共写入了 3 条数据。

sql 复制代码
insert into d1001 values
 ( "2018-10-03 14:38:05", 10.2, 220, 0.23),
 ( "2018-10-03 14:38:15", 12.6, 218, 0.33),
 ( "2018-10-03 14:38:25", 12.3, 221, 0.31)

上面的 SQL 一共写入了三条数据。

一次写入多表

假设设备 ID 为 d1001、d1002、d1003 的 3 台智能电表,都是每 30 秒需要写入 3 条数据。对于这种情况,TDengine 支持一次向多个表写入多条数据。

sql 复制代码
INSERT INTO d1001 VALUES 
    ("2018-10-03 14:38:05", 10.2, 220, 0.23),
    ("2018-10-03 14:38:15", 12.6, 218, 0.33),
    ("2018-10-03 14:38:25", 12.3, 221, 0.31) 
d1002 VALUES 
    ("2018-10-03 14:38:04", 10.2, 220, 0.23),
    ("2018-10-03 14:38:14", 10.3, 218, 0.25),
    ("2018-10-03 14:38:24", 10.1, 220, 0.22)
d1003 VALUES
    ("2018-10-03 14:38:06", 11.5, 221, 0.35),
    ("2018-10-03 14:38:16", 10.4, 220, 0.36),
    ("2018-10-03 14:38:26", 10.3, 220, 0.33)
;

上面的 SQL 一共写入了九条数据。

指定列写入

可以通过指定列向表的部分列写入数据。SQL 中没有出现的列,数据库将自动填充为空值(NULL)。注意,时间戳列必须存在,且值不能为空。如下 SQL 向子表 d1004 写入了一条数据。这条数据只包含电压和相位,电流值为 NULL。

sql 复制代码
insert into d1004 (ts, voltage, phase) values("2018-10-04 14:38:06", 223, 0.29)

写入时自动建表

用户可以使用带有 using 关键字的自动建表语句进行写入。当子表不存在时,先触发自动建表,再写入数据;当子表已经存在时,则直接写入。使用自动建表的 insert 语句,也可以通过指定部分标签列进行写入,未被指定的标签列的值为空值(NULL)。如下 SQL 写入一条数据。当子表 d1005 不存在时,先自动建表,标签 group_id 的值为 NULL,再写入数据

sql 复制代码
insert into d1005
using meters (location)
tags ( "beijing.chaoyang")
values ( "2018-10-04 14:38:07", 10.15, 217, 0.33)

自动建表的 insert 语句也支持在一条语句中向多张表写入数据。如下 SQL 使用自动建表的 insert 语句共写入 9 条数据。

sql 复制代码
INSERT INTO d1001 USING meters TAGS ("California.SanFrancisco", 2) VALUES 
    ("2018-10-03 14:38:05", 10.2, 220, 0.23),
    ("2018-10-03 14:38:15", 12.6, 218, 0.33),
    ("2018-10-03 14:38:25", 12.3, 221, 0.31) 
d1002 USING meters TAGS ("California.SanFrancisco", 3) VALUES 
    ("2018-10-03 14:38:04", 10.2, 220, 0.23),
    ("2018-10-03 14:38:14", 10.3, 218, 0.25),
    ("2018-10-03 14:38:24", 10.1, 220, 0.22)
d1003 USING meters TAGS ("California.LosAngeles", 2) VALUES
    ("2018-10-03 14:38:06", 11.5, 221, 0.35),
    ("2018-10-03 14:38:16", 10.4, 220, 0.36),
    ("2018-10-03 14:38:26", 10.3, 220, 0.33)
;

通过超级表写入

TDengine 还支持直接向超级表写入数据。需要注意的是,超级表是一个模板,本身不存储数据,写入的数据是存储在对应的子表中。如下 SQL 通过指定 tbname 列向子表 d1001 写入一条数据。

sql 复制代码
insert into meters (tbname, ts, current, voltage, phase, location, group_id)
values("d1001", "2018-10-03 14:38:05", 10.2, 220, 0.23, "California.SanFrancisco", 2)

通过虚拟表写入

TDengine 不支持向虚拟表或虚拟超级表写入,因为虚拟表或虚拟超级表是动态生成的,本身不存储数据。

零代码写入

为了方便用户轻松写入数据,TDengine 已与众多知名第三方工具实现无缝集成,包括 Telegraf、Prometheus、EMQX、StatsD、collectd 和 HiveMQ 等。用户只须对这些工具进行简单的配置,便可轻松将数据导入 TDengine。此外,TDengine Enterprise 还提供了丰富的连接器,如 MQTT、OPC、AVEVA PI System、Wonderware、Kafka、MySQL、Oracle 等。通过在 TDengine 端配置相应的连接信息,用户无须编写任何代码,即可高效地将来自不同数据源的数据写入 TDengine。

更新

可以通过写入重复时间戳的一条数据来更新时序数据,新写入的数据会替换旧值。下面的 SQL,通过指定列的方式,向子表 d1001 中写入 1 行数据;当子表 d1001 中已经存在日期时间为 2018-10-03 14:38:05 的数据时,current(电流)的新值 22,会替换旧值。

sql 复制代码
INSERT INTO d1001 (ts, current) VALUES ("2018-10-03 14:38:05", 22);

删除

为方便用户清理由于设备故障等原因产生的异常数据,TDengine 支持根据时间戳删除时序数据。下面的 SQL,将超级表 meters 中所有时间戳早于 2021-10-01 10:40:00.100 的数据删除。数据删除后不可恢复,请慎重使用。为了确保删除的数据确实是自己要删除的,建议可以先使用 select 语句加 where 后的删除条件查看要删除的数据内容,确认无误后再执行 delete。

sql 复制代码
delete from meters where ts < '2021-10-01 10:40:00.100' ;

访问官网

更多内容欢迎访问 TDengine 官网

相关推荐
一 乐2 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
美林数据Tempodata4 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数
野槐4 小时前
node.js连接mysql写接口(一)
数据库·mysql
G皮T4 小时前
【Elasticsearch】正排索引、倒排索引(含实战案例)
大数据·elasticsearch·搜索引擎·kibana·倒排索引·搜索·正排索引
Zzzone6835 小时前
PostgreSQL日常维护
数据库·postgresql
chxii5 小时前
1.13使用 Node.js 操作 SQLite
数据库·sqlite·node.js
冰刀画的圈5 小时前
修改Oracle编码
数据库·oracle
这个胖子不太裤5 小时前
Django(自用)
数据库·django·sqlite
麻辣清汤5 小时前
MySQL 索引类型及其必要性与优点
数据库·mysql
2501_915374356 小时前
Neo4j 图数据库安装教程(2024最新版)—— Windows / Linux / macOS 全平台指南
数据库·windows·neo4j