全部產品
Search
文件中心

Lindorm:UPDATE

更新時間:Jun 07, 2025

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

根據非主鍵更新

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

  • 該功能目前公測中,如需使用,請聯絡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計算引擎來進行批次更新。