批量更新场景问题

【 TiDB 使用环境】生产环境
【 TiDB 版本】 6.1
【复现路径】
【遇到的问题:问题现象及影响】
业务中有批量更新的场景,tidb社区提供了批量更新的语句 批量更新 , 该场景是将满足多个条件的列更新为相同的值,我现在遇到的问题是支不支持将多个条件的列更新成对应的值:

create table example (id int primary key , val varchar(255) not null default '');

insert into example(id,val) values (1,'1'), (2,'2'), (3,'3');
select * from example

-- 这是目前支持的语法
update example set val = 'updated' where (id,val) in (1,'1'), (2,'2'), (3,'3')

-- 期望更新的方式,
update example set ( val = 'update1' ), (val = 'update2') , (val = 'update3') where (id,val) in (1,'1'), (2,'2'), (3,'3')

不知道tidb是否支持这样的 多列不同值的更新,
否则业务上只能循环去做更新了。

支持多列更新的,对于 tidb 来说多列也是一行数据而已…
这个语法上和mysql 是一致的

但是要控制好更新数据行量的大小,这个和事务有关系
过大的事务,可能会失败…

1 个赞

我感觉这种写法并不直观,in后面的条件多了以后出错的可能性很大,不如一行一行来的实在。

2 个赞

这种方式可以

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa1  |
|    2 | bb1  |
|    3 | cc1  |
+------+------+
3 rows in set (0.00 sec)

mysql> UPDATE t1
    -> SET name = (CASE name WHEN 'aa1' THEN 'aa2' WHEN 'bb1' THEN 'bb2'WHEN 'cc1' THEN 'cc2' END)
    -> WHERE id IN(1, 2 ,3);
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from t1;
+------+------+
| id   | name |
+------+------+
|    1 | aa2  |
|    2 | bb2  |
|    3 | cc2  |
+------+------+
3 rows in set (0.00 sec)
3 个赞

谢谢,

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。