MySQL的UPDATE…CASE…WHEN…THEN批量更新语句

在 MySQL 中,UPDATE…CASE…WHEN…THEN 语句用于基于条件更新数据。这种语法使你能够在一条 UPDATE 语句中更新不同的字段值,依据每一行的条件来决定如何更新。相比于使用多条 UPDATE 语句一行行更新数据库,可以极大得提高性能。

语法结构:

UPDATE table_name
SET column_name = CASE
                      WHEN condition1 THEN value1
                      WHEN condition2 THEN value2
                      ELSE value3
                  END
WHERE some_condition;

实例

假设我们有一个名为 employees 的表,它有 id, name, salary 和 position 等字段。我们想要根据员工的职位来调整工资。

需求:

对于职位为 “Manager” 的员工,工资增加 1000。

对于职位为 “Developer” 的员工,工资增加 500。

对于其他职位的员工,工资保持不变。

SQL 语句:

UPDATE employees
SET salary = CASE
                 WHEN position = 'Manager' THEN salary + 1000
                 WHEN position = 'Developer' THEN salary + 500
                 ELSE salary
             END;

更复杂情况:

你还可以使用多个 CASE 来更新不同的字段,或者在 WHEN 中使用更复杂的条件。例如:如果你想同时更新 salary 和 position 字段,可以这样做:

UPDATE employees
SET 
    salary = CASE
                 WHEN position = 'Manager' THEN salary + 1000
                 WHEN position = 'Developer' THEN salary + 500
                 ELSE salary
             END,
    position = CASE
                  WHEN position = 'Developer' THEN 'Senior Developer'
                  ELSE position
              END;

但这个语句不是没有缺点:

  • 应用层代码拼接这个SQL时,要注意这条长语句会不会长到MySql 的语句长度的上限
  • 这个语句默认会更新所有行,因此需要在WHRER子句中添加IN等条件来过滤
  • 这个语句会锁定很多行,也可能会锁表

参考

Redis 缓存同步至数据库时的 N+1 问题