在mysql中,我的表格如下所示
昨天我学到了一个影响大型生产数据库的课程。
我的第一个要求就是将两个用户名a和b更新为z和y 第二个是将两个id为5和6的电子邮件更新为z.com和y.com
# ID, username, mail
1, a, a.com
2, b, b.com
3, c, c.com
4, d, d.com
5, e, e.com
6, f, f.com
7, g, g.com
8, h, h.com
9, i, i.com
10, j, j.com
所以,当我决定像这样做同时进行更新时
UPDATE test
SET username = CASE
WHEN username = 'a' THEN 'z'
WHEN username = 'b' THEN 'y'
END,
mail = CASE
WHEN id = 5 THEN 'z.com'
WHEN id = 6 THEN 'y.com'
END
我的prod db受此影响了。很多空值
# ID, username, mail
1, z,
2, y,
3, ,
4, ,
5, , z.com
6, , y.com
7, ,
8, ,
9, ,
10, ,
一旦我意识到,我应该在calsue中提到when条件列。比如下面的例子和它的工作
UPDATE test
SET username = CASE
WHEN username = 'a' THEN 'z'
WHEN username = 'b' THEN 'y'
END,
WHERE username IN ('a','b')
但这是一次更新。但如果同时做两个更新
UPDATE test
SET username = CASE
WHEN username = 'a' THEN 'z'
WHEN username = 'b' THEN 'y'
END,
mail = CASE
WHEN id = 5 THEN 'z.com'
WHEN id = 6 THEN 'y.com'
END
WHERE username IN ('a','b') AND id IN(5,6)
什么都没有得到更新。
所以我有些问题 1)为什么很多空来了......我错过了逻辑 2)为什么我的新查询在两列中都进行了更新..?
先谢谢
答案 0 :(得分:1)
您可以在else
表达式中添加case when
,如下所示:
UPDATE test
SET
username = CASE
WHEN username = 'a' THEN 'z'
WHEN username = 'b' THEN 'y'
ELSE username
END,
mail = CASE
WHEN id = 5 THEN 'z.com'
WHEN id = 6 THEN 'y.com'
ELSE mail
END
-- ,dateCol = CASE
-- WHEN username IN ('a', 'b') OR id IN (5, 6) THEN NOW()
-- ELSE dateCol
-- END
在上一次update
查询中,尝试将and
更改为or
:
UPDATE test
SET username = CASE
WHEN username = 'a' THEN 'z'
WHEN username = 'b' THEN 'y'
ELSE username
END,
mail = CASE
WHEN id = 5 THEN 'z.com'
WHEN id = 6 THEN 'y.com'
ELSE mail
END
-- ,dateCol = now()
WHERE username IN ('a','b') OR id IN (5,6)