12

我有一个包含列nameclient_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”。
查询应该是什么样子才能仅在适用的情况下应用更改?

4

2 回答 2

26

添加一个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陈述都很好。

于 2012-06-27T17:50:56.087 回答
5

不是很优雅,不是很高效,但在一个查询中:

UPDATE names SET 
name =  CASE  name 
    WHEN 'Mic' THEN 'Micheal' ELSE name END,
client_name = CASE  client_name 
    WHEN 'Mic' THEN 'Micheal' ELSE client_name END,
requester_name= CASE  requester_name 
    WHEN 'Mic' THEN 'Micheal' ELSE requester_name END ;

这使用CASE的缩写(Postgresql 特定)语法。

(顺便说一句:我猜你的意思是“迈克尔”而不是“迈克尔”?)

于 2012-06-27T16:21:40.080 回答