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

oknwwptz  于 2023-03-11  发布在  Mysql
关注(0)|答案(8)|浏览(155)

我试着理解如何更新多行不同的值,但我就是不明白。解决方案无处不在,但对我来说,它看起来很难理解。
例如,将三个更新合并为一个查询:

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条件..任何想法?

vecaoik1

vecaoik11#

您可以这样做:

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

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

mbyulnm0

mbyulnm02#

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组合是主键。如果其中只有一个是 * 主键 *,则将另一个字段添加到UPDATE列表。如果它们都不是主键(似乎不太可能),则此方法将始终创建新记录-可能不是所需的记录。
但是,这种方法使预准备语句更容易构建,也更简洁。

vltsax25

vltsax253#

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

kognpnkq4#

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

but5z9lq5#

要在@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:删除临时表

0g0grzrc

0g0grzrc6#

在php中,使用mysqli示例的multi_query方法。

$sql = "SELECT COUNT(*) AS _num FROM test;
        INSERT INTO test(id) VALUES (1); 
        SELECT COUNT(*) AS _num FROM test; ";

$mysqli->multi_query($sql);

将结果与update 30,000 raw中的事务、插入和case方法进行比较。

**交易:5.5194580554962

垫片:0.20669293403625
案件编号:16.474853992462
多重:0.0412278175354**
如您所见,多语句查询比最高答案更高效。
以防万一,如果你得到这样的错误消息:

PHP Warning:  Error while sending SET_OPTION packet

您可能需要在mysql配置文件中增加max_allowed_packet

fnvucqvd

fnvucqvd7#

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

此处,第4列和第1列位于表1中。第2列和第3列位于表2中
我正在尝试更新每个col1,其中col4 = col3每行的值不同

chhkpiq4

chhkpiq48#

我是这么做的:

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

其中,推送设置为

public class PushSettings {

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

它工作正常

相关问题