数据删除
删除语法
DELETE 语句用于删除指定表或超级表中的数据,便于清理因设备故障等原因产生的异常数据。
DELETE FROM [db_name.]tb_name [WHERE condition] [SECURE_DELETE];
注意:删除数据并不会立即释放磁盘空间,而是将数据标记为已删除。查询时这些数据不会再出现,但磁盘空间的释放会延迟到系统自动清理(建库参数 KEEP 生效)或用户手动进行 数据重整 时(企业版功能 COMPACT)。若需在删除标记之外对落盘数据块做物理覆写,可使用库级 / 语句级 SECURE_DELETE,行为见 数据安全 · 安全删除。
参数说明
db_name:可选参数,指定表所在的数据库名;不指定时使用当前数据库。tb_name:必填参数,指定要删除数据的表名,可以是普通表、子表或超级表。condition:可选参数,指定删除数据的过滤条件。不指定过滤条件时会删除表中的全部数据,请慎重使用。WHERE条件支持三类子句,可任意组合、任意缺省,但相互之间只能用AND连接:- 主键时间列条件:对第一列时间列的过滤,必须能收敛为一个确定的闭合时间区间(例如
ts > '2021-10-01 10:00:00' AND ts < '2021-10-01 11:00:00')。 - 标签列条件:用于在超级表上圈定要执行删除的子表集合,不参与"删除哪些行"的判定。
- 普通列条件:对非主键、非标签的数据列取值过滤,用于在已圈定的子表与时间区间内进一步精确定位要删除的行。仅支持单列与常量之间的简单比较谓词(
=、!=、>、>=、<、<=、BETWEEN、IN、IS [NOT] NULL,以及字符串列的LIKE、MATCH),不支持函数表达式、跨列比较和子查询;多个普通列条件之间可以使用OR。
- 主键时间列条件:对第一列时间列的过滤,必须能收敛为一个确定的闭合时间区间(例如
SECURE_DELETE:可选关键字。指定后,本次删除在写入删除标记之外,会对命中区间的落盘数据块做物理覆写;也可通过数据库选项SECURE_DELETE 1对库内删除默认开启(见 数据库 · SECURE_DELETE)。
特别说明
数据删除后不可恢复,请慎重使用。为确保待删除数据符合预期,建议先使用 SELECT 语句加上与删除操作相同的 WHERE 条件查看数据内容,确认无误后再执行 DELETE 语句。
使用普通列过滤条件时还需注意:
- 该功能需要先扫描时间区间内的候选数据并逐行求值,耗时与执行一条同条件的
SELECT相当。不带时间范围限定时相当于一次全表扫描,建议尽可能补充时间范围以收窄影响面。 - 建有复合主键的表不支持普通列过滤条件。复合主键允许同一时间戳上存在多行,而删除标记只能按时间定位、无法区分同一时间戳上的不同行,因此该场景会直接报错而不是执行可能超出预期的删除。
- 普通列过滤条件不能与
SECURE_DELETE同时使用。 - 若命中的行在时间上过于分散,单条语句生成的删除标记数量可能超过上限并报错,此时可收窄时间范围或过滤条件后分批删除。
示例
meters 是一个超级表,groupId 是 INT 类型的标签列。删除 meters 中时间戳小于 2021-10-01 10:40:00.100 的全部数据,SQL 如下:
DELETE FROM meters WHERE ts < '2021-10-01 10:40:00.100';
执行后显示结果为:
Deleted 102000 row(s) from 1020 table(s) (0.421950s)
表示从 1020 个子表中共删除了 102000 行数据。
删除 meters 中电压异常(voltage 超过 250V)的采集记录,SQL 如下:
DELETE FROM meters WHERE voltage > 250;
结合时间范围与标签条件,只清理 groupId 为 2 的设备在指定时间段内电流为负值的异常记录:
DELETE FROM meters
WHERE groupId = 2
AND ts >= '2021-10-01 10:00:00'
AND ts < '2021-10-01 11:00:00'
AND current < 0;








