在mysql中的多个案例更新中为空

时间:2016-08-09 07:32:14

标签: mysql

在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)为什么我的新查询在两列中都进行了更新..?

先谢谢

1 个答案:

答案 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)