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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我试图理解如何用不同的值更新多个行,但我就是不明白。解决办法无处不在,但在我看来很难理解。

例如,对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'; 

但我真的不知道如何进行查询。

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';

日期应使用本机日期和时间类型存储在数据库中。

用户回答回答于

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,那么将另一个字段添加到更新列表中。如果它们都不是主键(这似乎不太可能),那么这种方法总是会创建新的记录--可能不是我们想要的。

然而,这种方法使准备好的语句更容易构建和更简洁。

扫码关注云+社区