我有一个表,其中包含 name
、client_name
和 requester_name
列。我需要将这些列的值从“Mic”更新为“Michael”。
以下是一些应该更新的记录:
name | client_name | requester_name
------+-------------+----------------
Mic | Jerry | Jack
Jack | Mic | Mic
Jerry | Jack | Mic
我尝试了以下查询:
UPDATE names
SET name='Michael', client_name='Michael', requester_name='Michael'
WHERE name='Mic' OR client_name='Mic' OR requester_name='Mic';
此查询使所有列的所有名称都更改为“Michael”。
查询应该是什么样子才能仅在适用的地方应用更改?
最佳答案
添加一个 WHERE
子句是明智的。
UPDATE names
SET name = CASE WHEN name = 'Mic' THEN 'Michael' ELSE name END
,client_name = CASE WHEN client_name = 'Mic' THEN 'Michael'
ELSE client_name END
,requester_name = CASE WHEN requester_name = 'Mic' THEN 'Michael'
ELSE requester_name END
WHERE 'Mic' IN (name, client_name, requester_name);
否则,将无条件更新整个表。将值更改为相同值的更新仍然是创建死行、触发触发器等的更新。虽然生成的行不会出错,但它仍然会使表膨胀到其大小的两倍,这使得 VACUUM
成为必需,并且通常非常慢。
顺便说一句,CASE
语句的任何一种形式在这里都很好。
关于sql - 在单个命令中有条件地更新表的多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230465/