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

时间:2014-09-04 20:48:22

标签: mysql sql sql-update

我正在尝试了解如何更新具有不同值的多行,而我却无法获得它。解决方案无处不在,但对我来说,它看起来很难理解。

例如,三个更新为1个查询:

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

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

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

read一个例子,但我真的不明白如何进行查询。即:

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

如果在WHERE和IF条件中存在多个条件,我不完全清楚如何进行查询。任何想法?

7 个答案:

答案 0 :(得分:141)

你可以这样做:

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

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

答案 1 :(得分:77)

MySQL允许以更易读的方式将多个更新组合到单个查询中。这似乎更适合您描述的场景,更容易阅读,并避免那些难以解决的多个条件。

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

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

但是,这种方法使预编译语句更容易构建,更简洁。

答案 2 :(得分:10)

您可以使用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';

答案 3 :(得分:5)

union

答案 4 :(得分:1)

要在@Trevedhek answer上扩展,

如果必须使用非唯一键进行更新,则需要4个查询

注意:这不是交易安全的

这可以使用临时表来完成。

步骤1:创建临时表键和要更新的列

CREATE TEMPORARY TABLE  temp_table_users
(
    cod_user varchar(50)
    , date varchar(50)
    , user_rol varchar(50)
    ,  cod_office varchar(50)
) ENGINE=MEMORY

第2步:将值插入到临时表中

第3步:更新原始表

UPDATE table_users t1
JOIN temp_table_users tt1 using(user_rol,cod_office)
SET 
t1.cod_office = tt1.cod_office
t1.date = tt1.date

步骤4:删除临时表

答案 5 :(得分:0)

UPDATE Table1 SET col1= col2 FROM (SELECT col2, col3 FROM Table2) as newTbl WHERE col4= col3

col4和col1在表1中。 col2和col3在Table2中
我正在尝试更新每个col1,其中col4 = col3每行的值不同

答案 6 :(得分:-1)

我是这样做的:

<update id="updateSettings" parameterType="PushSettings">
    <foreach collection="settings" item="setting">
        UPDATE push_setting SET status = #{setting.status}
        WHERE type = #{setting.type} AND user_id = #{userId};
    </foreach>
</update>

PushSettings在哪里

public class PushSettings {

    private List<PushSetting> settings;
    private String userId;
}

工作正常