跳到主要内容

数据删除

删除语法​

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;