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?
是的,使用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;
这使得添加更多行变得更容易,并展示了使用join
with的强大功能update
。
编辑:
关于性能。两次更新需要在数据库中设置两个事务;一次更新只需要一次。因此,一次更新可能会快一点。只有在没有索引的情况下,性能差异才会明显userTable(userId)
。使用这样的索引,两个版本(带有where
子句和 using join
)都应该使用索引来查找要快速更新的行。
但是,还有一个更重要的区别。两次更新使表处于更新“之间”的不一致状态——用户 ID 和名称在这些更新之间将不一致。如果第二个失败或有人使用该表,他们将有不一致的数据。你想同时进行这两个更新(你也可以通过使用显式事务来解决这个问题,但为什么要麻烦呢?)。
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)
我将许多这样的 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);
一种方法是
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)
虽然用两个查询来做也很好。
用例 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)