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使用限制
不支援更新主鍵:主鍵作為行的唯一標識不可更新,此時的更新等於插入新行,可直接使用
UPSERT插入。不保障多行原子性:執行一個批次更新操作時,如果過程中發生報錯,無法保障原子性,可能出現部分行更新成功,部分行更新失敗的情況。如果未報錯,則全部更新成功。例如:
UPDATE sensor SET c1 = 2, c2=4,c4 =6 WHERE p1 = 1;的範圍更新。不保障等冪性:
UPDATE不保障等冪性。對於累加這種情形下,如果過程中發生報錯,UPDATE可能會重試,導致結果不正確。等冪的SQL:
UPDATE sensor SET c1 = 2 WHERE p1 = 1;可能多次賦值,但不影響正確性。不等冪SQL:
UPDATE sensor SET c1 = c1 + 1 WHERE p1 = 1;可能會因為多次累加導致結果不準確。
不支援跨行事務:如果想通過一條
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計算引擎來進行批次更新。