UPDATE文法用於更新寬表引擎中的資料。本文介紹UPDATE文法相關說明和使用時的注意事項。
引擎與版本
文法
update_statement ::= UPDATE [hint_clause] table_identifier
SET column_identifier = value (',' column_identifier = value ) *
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使用限制
不支援更新主鍵。
不保證單行原子性:執行累加操作時(例如增加某個欄位的數值),如果過程中發生錯誤需要重試,可能會因為重複計算而導致結果不準確。
不支援跨行事務:如果想通過一條
UPDATE命令同時修改多行資料,在執行過程中一旦出現任何錯誤,可能會造成部分行成功更新而部分行更新失敗的情況。說明通過運算式更新非主鍵欄位時(例如本文中的樣本:增加列值),建議僅限定單行操作並明確指定全部主鍵,方便快速定位需更新的行。
標量更新操作(例如更新子句為
c1 =1)出現部分更新失敗時,重試更新操作。
樣本
假設表結構及表中資料如下:
-- 建立表sensor
CREATE TABLE sensor (
p1 INTEGER NOT NULL,
c1 INTEGER,
c2 VARCHAR,
c3 VARCHAR,
PRIMARY KEY(p1)
);
-- 插入一行資料
UPSERT INTO sensor(p1, c1, c2, c3) VALUES(1,1,'a','a');此時表中資料如下所示:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | a | a |
+----+----+----+----+根據主鍵更新
UPDATE sensor SET c2='b' WHERE p1=1;結果驗證
您可以執行SELECT * FROM sensor;語句,驗證資料是否更新成功。預計返回結果如下:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | b | a |
+----+----+----+----+根據非主鍵更新
UPDATE sensor SET c3='b' WHERE c1=1;結果驗證
您可以執行SELECT * FROM sensor;語句,驗證資料是否更新成功。預計返回結果如下:
+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1 | 1 | b | b |
+----+----+----+----+增加列值
UPDATE sensor SET c1 = c1 + 1 WHERE p1 = 1;結果驗證
您可以執行SELECT * FROM sensor;語句,驗證資料是否更新成功。預計返回結果如下:
+------+------+------+------+
| p1 | c1 | c2 | c3 |
+------+------+------+------+
| 1 | 2 | b | b |
+------+------+------+------+常見問題
Q1:資料更新執行完成,為什麼結果的影響行數(AFFECTED ROWS)不符合預期?
A1:搜尋索引表和主表中的資料不是強一致的,資料的同步可能會存在延遲。如果您為主表建立了搜尋索引,且更新條件命中索引列,則可能因為資料同步延遲的原因,導致更新失敗(即
AFFECTED ROWS:不符合預期)。您可以等待所有資料同步完成,再次執行更新操作。關於搜尋索引的延遲時間長度說明,請參見常見問題。Q2:批次更新時報錯執行逾時是什麼原因?
A2:批次更新時,不建議單次更新萬行以上的資料。如果有大批次更新的需求,建議您在更新語句中添加HINT參數(_l_operation_timeout_)來增加逾時時間,例如
UPDATE /*+ _l_operation_timeout_(30000) */ table1 SET a=1 WHERE b=2;,_l_operation_timeout_參數的詳細介紹,請參見hintOption參數說明。如果添加逾時HINT後,多次更新依然存在逾時現象,您可以考慮使用Lindorm計算引擎來進行批次更新。