全部產品
Search
文件中心

Lindorm:UPDATE

更新時間:Feb 12, 2026

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  |
+----+----+----+----+

根據非主鍵更新

重要
  • 要求寬表引擎為2.8.2.29及以上版本。您可以通過控制台查看目前的版本升級小版本至2.8.2.29及以上。

  • 該功能目前公測中,如需使用,請聯絡Lindorm支援人員(DingTalk號:s0s3eg3)。

UPDATE sensor SET c3='b' WHERE c1=1;

結果驗證

您可以執行SELECT * FROM sensor;語句,驗證資料是否更新成功。預計返回結果如下:

+----+----+----+----+
| p1 | c1 | c2 | c3 |
+----+----+----+----+
| 1  | 1  | b  | b  |
+----+----+----+----+

增加列值

重要
  • 要求寬表引擎為2.7.6及以上版本。您可以通過控制台查看目前的版本升級小版本至2.7.6及以上。

  • 該功能目前公測中,如需使用,請聯絡Lindorm支援人員(DingTalk號:s0s3eg3)。

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計算引擎來進行批次更新。