6
UPDATE userTable 
SET userAge=245, userName="fred"  WHERE userId = 321, 
SET userAge=32, userName="dave" WHERE userId = 424;

Is there a better way to write this code?

4

5 回答 5

8

是的,使用case语句:

UPDATE userTable 
    SET userAge= (case when userId = 321 then 245 else 32 end),
        userName= (case when userId = 321 then 'fred' else 'dave' end)
    WHERE userId in (321, 424);

但是,我认为更通用的编写方法是使用join语法:

UPDATE userTable join
       (select 321 as UserId, 'fred' as userName, 245 as userAge union all
        select 424, 'dave', 32
       ) toupdate
       on userTable.userId = toupdate.UserId
    set userTable.userAge = toupdate.userAge,
        userTable.userName = toupdate.userName;

这使得添加更多行变得更容易,并展示了使用joinwith的强大功能update

编辑:

关于性能。两次更新需要在数据库中设置两个事务;一次更新只需要一次。因此,一次更新可能会快一点。只有在没有索引的情况下,性能差异才会明显userTable(userId)。使用这样的索引,两个版本(带有where子句和 using join)都应该使用索引来查找要快速更新的行。

但是,还有一个更重要的区别。两次更新使表处于更新“之间”的不一致状态——用户 ID 和名称在这些更新之间将不一致。如果第二个失败或有人使用该表,他们将有不一致的数据。你想同时进行这两个更新(你也可以通过使用显式事务来解决这个问题,但为什么要麻烦呢?)。

于 2013-08-06T13:53:55.327 回答
5
UPDATE userTable 
SET userAge =  case when userId = 321 then 245
                    when userId = 424 then 32
               end,
    userName = case when userId = 321 then "fred"
                    when userId = 424 then "dave"   
               end      
WHERE userId in (321, 424) 
于 2013-08-06T13:53:35.860 回答
2

我将许多这样的 UPDATE 查询组合在一起的解决方案是 INSERT INTO... ON DUPLICATE KEY UPDATE。因此,如果 userId 是主键,您可以使用

INSERT INTO userTable (userId, userAge, userName) VALUES
(321,245,"fred"),(424,32,"dave")
ON DUPLICATE KEY UPDATE userAge = VALUES(userAge), userName = VALUES(userName);
于 2013-08-06T13:59:23.683 回答
2

一种方法是

UPDATE userTable 
SET userAge=(case when userId=321 then 245 else 424 end),
    userName=(case when userId=321 then 'fred' else 'dave' end)
WHERE userId in (321,, 424)

虽然用两个查询来做也很好。

于 2013-08-06T13:54:01.237 回答
2

用例 STATMENTS 代替。

UPDATE userTable 
    SET userAge =  case when userId = 321  then 245
                        when userId = 424  then 32     end,
       userName = case  when userId = 321  then "fred"
                        when userId = 424  then "dave"  end      
     WHERE userId in (321, 424) 
于 2013-08-06T13:54:16.083 回答