MySQL - 在一个查询中更新具有不同值的多行

问题描述:

我想了解如何更新具有不同值的多行,而我只是不明白它。解决方案无处不在,但对我来说,看起来很难理解。MySQL - 在一个查询中更新具有不同值的多行

例如,三次更新到1个查询:

UPDATE table_users 
SET cod_user = '622057' 
    , date = '12082014' 
WHERE user_rol = 'student' 
    AND cod_office = '123456'; 

UPDATE table_users 
SET cod_user = '2913659' 
    , date = '12082014' 
WHERE user_rol = 'assistant' 
    AND cod_office = '123456'; 

UPDATE table_users 
SET cod_user = '6160230' 
    , date = '12082014' 
WHERE user_rol = 'admin' 
    AND cod_office = '123456'; 

read一个例子,但是我真的不知道如何使查询。即:

UPDATE table_to_update 
SET cod_user= IF(cod_office = '123456','622057','2913659','6160230') 
    ,date = IF(cod_office = '123456','12082014') 
WHERE ?? IN (??) ; 

我不完全清楚如何做的查询如果有多个条件在WHERE和IF条件..任何想法?

你可以这样来做:

UPDATE table_users 
    SET cod_user = (case when user_role = 'student' then '622057' 
         when user_role = 'assistant' then '2913659' 
         when user_role = 'admin' then '6160230' 
        end), 
     date = '12082014' 
    WHERE user_role in ('student', 'assistant', 'admin') AND 
      cod_office = '17389551'; 

我不明白你的日期格式。日期应该使用本地日期和时间类型存储在数据库中。

+0

我该怎么做才能执行更新,如果记录已经存在 – franvergara66 2014-09-07 02:21:05

+0

@ franvergara66。 。 。我不明白你的评论。 'update's只影响已经存在的记录。 – 2014-09-07 02:47:31

+0

打扰我的英语先生,当我尝试进行更新MySQL给我的错误:#1062 - 重复项'XXX'为'PRIMARY'键。当我尝试用已有的相同值更新记录时,如果当前值与正在更新的值相同,是否有任何方法可以跳过更新? – franvergara66 2014-09-07 03:03:37

您可以使用CASE语句来处理多的if/then场景:

UPDATE table_to_update 
SET cod_user= CASE WHEN user_rol = 'student' THEN '622057' 
        WHEN user_rol = 'assistant' THEN '2913659' 
        WHEN user_rol = 'admin' THEN '6160230' 
       END 
    ,date = '12082014' 
WHERE user_rol IN ('student','assistant','admin') 
    AND cod_office = '17389551'; 
+1

您在CASE声明结尾处犯了错字:您有两个逗号彼此相邻。 – pmrotule 2015-04-14 01:45:07

MySQL允许一个更可读的方式将多个更新合并成一个单一的查询。这似乎更适合你描述的场景,更容易阅读,并且避免了那些难以解决多种情况的难题。

INSERT INTO table_users (cod_user, date, user_rol, cod_office) 
VALUES 
('622057', '12082014', 'student', '123456'), 
('2913659', '12082014', 'assistant','123456'), 
('6160230', '12082014', 'admin', '123456') 
ON DUPLICATE KEY UPDATE 
cod_user=VALUES(cod_user), date=VALUES(date) 

这里假定user_rol, cod_office组合是主键。如果其中只有一个是PK,则将其他字段添加到UPDATE列表中。 如果它们都不是主键(这似乎不太可能),那么这种方法将始终创建新的记录 - 可能不是想要的。

但是,这种方法使准备好的语句更易于构建并且更加简洁。

+2

谢谢!这是我搜索很长时间,最清晰的方式,我无法弄清楚这个语法,特别是'cod_user = VALUES(cod_user),...',甚至来自官方的MySQL 5.6文档 – user3198882 2016-07-06 12:36:56

+10

注意:这将是如果表中不存在密钥导致不需要的记录,请添加新行。 – Faraz 2016-07-17 07:53:31

+0

棘手使用永不插入IODKU,但非常优雅。 – 2017-06-06 18:23:31

update table_name 
set cod_user = 
    CASE 
    WHEN user_rol = 'student' THEN '622057' 
    WHEN user_rol = 'assistant' THEN '2913659' 
    WHEN user_rol = 'admin' THEN '6160230'? 
    END,date = '12082014' 

WHERE user_rol IN ('student','assistant','admin') 
AND cod_office = '17389551';