UPDATE

UPDATE语法用于更新宽表引擎中的数据。本文介绍UPDATE语法相关说明和使用时的注意事项。

引擎与版本

语法

update_statement ::= UPDATE [hint_clause] table_identifier
                     SET column_identifier = value (',' column_identifier = value ) *
                     WHERE where_clause

使用限制

  • 不支持更新主键。

  • 不保证单行原子性:执行累加操作时(例如增加某个字段的数值),如果过程中发生错误需要重试,可能会因为重复计算而导致结果不准确。

  • 不支持跨行事务:如果想通过一条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  |
+----+----+----+----+

根据非主键更新

重要

该功能目前公测中,如需使用,请联系Lindorm技术支持(钉钉号:s0s3eg3)。

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

结果验证

您可以执行SELECT * FROM sensor;语句,验证数据是否更新成功。预计返回结果如下:

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

增加列值

重要

该功能目前公测中,如需使用,请联系Lindorm技术支持(钉钉号: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计算引擎来进行批量更新。