DELETE语法用于按行删除宽表中的数据或删除时序表中指定条件下的时间线。
引擎与版本
语法
delete_statement ::= DELETE FROM table_identifier
WHERE where_clause
where_clause ::= relation ( AND|OR relation )*
relation ::= column_name operator term
| '(' column_name ( ',' column_name )* ')' operator tuple_literal
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | IS NOT? NULL | LIKE
使用说明
在使用DELETE
语句删除数据前,您需要注意以下内容。
对于宽表引擎:
宽表引擎版本低于2.7.5时,
DELETE
语句仅支持单行删除,即删除条件必须指定一行数据的全部主键才能够删除一行数据,否则会报错。2.7.5及以上的版本,DELETE语句可支持批量删除。(该功能默认不开启,如需使用,请联系 Lindorm 技术支持)。如何查看或升级当前版本,请参见宽表引擎版本说明和升级小版本。删除操作并非是先读取再删除,而是直接写入删除标记。所以无论被删除的行是否存在,删除都会成功。
使用
UPSERT
写入数据时如果通过HINT将未来时间戳作为数据的版本 ,那么在执行DELETE
操作时,即使DELETE
语句执行成功,未来时间戳的数据也并不会被真正删除。详细介绍,请参见多版本数据管理。
对于时序引擎:
DELETE
的WHERE条件中只能指定TAG列的过滤条件。DELETE
无法删除单条具体数据,只能删除满足TAG过滤条件的时间序列中的所有数据。
删除条件(where_clause)
宽表引擎和时序引擎均支持指定删除条件(where_clause)。
宽表引擎
2.7.5以下版本:where_clause必须包含全部主键列的等值过滤条件(即column_name = value),且只能删除单行。
2.7.5及以上版本,但未开启批量删除:where_clause必须包含全部主键列的等值过滤条件,且只能删除单行。
2.7.5级以上版本,已开启批量删除:where_clause支持广泛的过滤条件,和
SELECT
语句的where_clause类似。重要在执行过程中一旦发生任何错误(例如超时),可能会造成部分删除的情况。
时序引擎
where_clause必须是TAG列,删除操作会把满足TAG过滤条件的时间线中所有数据全部删除。
关系表达式(relation)
使用DELETE语法在时序表中删除时间线时,指定的column_identifier必须是VARCHAR列(标签列)。
示例
假设表结构以及表中数据如下:
-- 创建表 sensor
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
p2 INTEGER NOT NULL,
c1 VARCHAR,
c2 VARCHAR,
PRIMARY KEY(p1, p2)
);
-- 插入三条数据
UPSERT INTO sensor(p1, p2, c1, c2) VALUES (1,1,'a','a'),(2,2,'b','b'),(3,3,'c','c');
单行删除
DELETE FROM sensor WHERE p1 = 1 AND p2 = 1;
结果验证
您可以执行SELECT * FROM sensor;
语句,验证数据是否删除成功。预计返回结果如下:
+------+------+------+------+
| p1 | p2 | c1 | c2 |
+------+------+------+------+
| 2 | 2 | b | b |
| 3 | 3 | c | c |
+------+------+------+------+
批量删除
该功能目前还在公测中,如需使用,请联系Lindorm 技术支持(钉钉号:s0s3eg3)。
DELETE FROM sensor WHERE c1 > 'b' OR p2 > 1;
结果验证
您可以执行SELECT * FROM sensor;
语句,验证数据是否删除成功。