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 支援人員(DingTalk號:s0s3eg3)。
DELETE FROM sensor WHERE c1 > 'b' OR p2 > 1;結果驗證
您可以執行SELECT * FROM sensor;語句,驗證資料是否刪除成功。