我們之前總結過時序數據的幾大特點,其中包括數據極少有更新操作,數據有保留期限。所有從時序數據的特點以及處理性能出發,作為一款時序數據庫(Time-Series Database),TDengine 最初并沒有提供更新和刪除功能,用戶可以指定數據的保留期限,系統會自動刪除到期數據,以節省存儲空間。
不過隨著 TDengine 的應用越來越廣泛,有些應用場景下,很多客戶提出了更新數據的需求,比如:
“如果儀表上報的歷史數據中,有些數據存在跳轉不準,TDengine 支持更新操作嗎?”
“我們的應用在采集或通信中斷的時候,有臟數據存在,該如何處理?”
所以從 TDengine 2.0.8.0 版本開始,我們正式推出了數據更新功能。
近來,還有些客戶提出了刪除數據的需求,比如:
“如果因為綁定關系變化,數據被寫入了錯誤的表,該如何處理?”
為滿足這些客戶的需求,TDengine 2.6 企業版又提供了數據刪除功能。
下面分別來看一下這兩大功能。
更新(UPDATE)
從 2.0.8.0 版本開始,TDengine 引入了 UPDATE 參數,正式支持更新寫入的數據。從 2.1.7.0 版本開始,我們又進一步增強了該功能。目前它支持 0/1/2 這 3 個參數值。
- UPDATE 設為 0 時,表示不允許更新數據,后發送的相同時間戳的數據會被直接丟棄;
- UPDATE 設為 1 時,表示更新全部列數據,即如果更新一個數據行,其中某些列沒有提供取值,那么這些列會被設為 NULL;
- UPDATE 設為 2 時,表示支持更新部分列數據,即如果更新一個數據行,其中某些列沒有提供取值,那么這些列會保持原有數據行中的對應值。
要使用更新功能,則需要在創建數據庫時使用 UPDATE 參數,將其設置為 1 或 2。之后就可以使用 INSERT INTO 命令更新已經寫入的相同時間戳數據了。
刪除(DELETE)
DELETE 功能簡單易學,只需要一條 SQL 語句。
DELETE FROM [ db_name. ] tb_name [WHERE condition];
熟悉 Database 的朋友肯定一看就懂,其功能就是刪除指定表或超級表中的數據記錄。
我們再來分別看一下這里的幾個參數。
db_name : 可選參數,指定要刪除表所在的數據庫名,默認為當前數據庫。
tb_name : 必填參數,指定要刪除數據的表名,可以是普通表、子表,也可以是超級表。
condition: 可選參數,指定刪除數據的過濾條件,不指定過濾條件則為表中所有數據,請慎重使用。特別說明,這里的 where 條件中只支持對第一列時間列的過濾,如果是超級表,支持對 tag 列過濾。
下面看個例子。
假設 meters 是一個超級表,groupid 是 int 類型的 tag 列,現在要刪除 meters 表中時間小于 2021-10-01 10:40:00.100 且 tag 列 groupid 值為 1 的所有數據,實現該功能的 SQL 如下:
delete from meters where ts < '2021-10-01 10:40:00.100' and groupid=1 ;
執行該語句,結果為:
Deleted 102000 row(s) from 1020 table(s) (0.421950s)
它表示從 1020 個子表中共刪除了 102000 行數據。
如果你的業務中有刪除指定數據的需求,歡迎聯系我們,試用體驗 TDengine 企業版本!
正在開發的 TDengine 3.0,還將進一步優化相關功能,敬請期待。



























