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计算引擎来进行批量更新。