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

12 浏览
0 Comments

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

我正在尝试理解如何使用不同的值来更新多行数据,但我完全不明白。解决方案随处可见,但对我来说很难理解。\n例如,将三个更新操作合并为一个查询:\n

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

\n我在这里阅读了一个例子,但我真的不明白如何进行查询,比如:\n

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

\n如果WHERE条件和IF条件中有多个条件,我不太清楚如何进行查询...有什么想法吗?

0
0 Comments

在MySQL中,可以使用UPDATE语句一次更新多行数据的值。然而,有时候需要根据不同的条件更新不同的行,即在一次查询中更新多行数据的值。这就是"UPDATE multiple rows with different values in one query in MySQL"问题的出现原因。

解决这个问题的方法是使用CASE语句。在上述代码中,使用了CASE语句来根据不同的条件更新不同的行。首先,根据user_rol的值,分别将cod_user的值更新为不同的值。然后,将date的值更新为'12082014'。最后,使用WHERE子句来指定要更新的行的条件,其中包括user_rol和cod_office的值。

通过这种方法,可以在一次查询中更新多行数据的值,而不需要多次执行UPDATE语句。这样可以提高查询性能,并简化代码的编写。

总结起来,解决"UPDATE multiple rows with different values in one query in MySQL"问题的方法是使用CASE语句来根据不同的条件更新不同的行的值。通过这种方法,可以在一次查询中更新多行数据的值,提高查询性能,并简化代码的编写。

0
0 Comments

MySQL允许将多个更新操作合并到一个查询中,使得查询更易读,避免了多重条件的困扰。如果user_rol, cod_office组合是一个主键,那么可以使用以下方法来进行多行更新:

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)

如果只有其中一个字段是主键,那么需要将另一个字段添加到UPDATE列表中。如果两个字段都不是主键,那么这种方法将始终创建新的记录,可能不是所期望的结果。

这种方法使得构建预处理语句更加简洁易懂。需要注意的是,这种方法要求为表设置主键。

这种方法的使用有一些注意事项:

- 如果表中不存在所需的主键,则会添加新的行,导致出现不希望的记录。

- 如果省略了任何一个不能为null的列,则该方法将无效,因为在尝试更新之前,SQL仍然会尝试创建新的记录。

- 可以通过在查询中添加FROM和WHERE子句来确保不会实际插入任何内容,从而避免添加新行。

- 如果PDO模拟准备语句,那么65535个占位符的限制就不适用。

这种方法比传统的多次更新语句更快,并且可以应用于更多动态的情况。这种方法还允许在更新的同时插入缺失的行。

关于忽略null列的问题,可以尝试去除相应列的NOT NULL约束。对于某些情况,可能需要使用单独的SQL语句来解决。

需要注意的是,user_rol, cod_office组合不一定是主键,它们也可以属于UNIQUE索引。

有人认为用REPLACE替代INSERT,并去掉ON DUPLICATE部分会更好。但是这样做可能会破坏自增键、删除触发器和插入触发器等。

总之,使用这种方法可以更简洁地进行多行更新,提高查询效率。

0
0 Comments

问题的出现原因是在MySQL中一次查询中更新多行的不同值。 解决方法是使用CASE语句将不同的值分配给相应的行,并在WHERE子句中指定要更新的行。

以下是文章的整理内容:

在MySQL中,我们可以使用一次查询来更新多行的不同值。这可以通过使用CASE语句来实现。下面是一个示例查询:

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

这个查询将根据不同的user_role值更新cod_user字段,并将date字段设置为'12082014'。在WHERE子句中,我们指定了要更新的行的条件,即user_role必须是'student'、'assistant'或'admin',并且cod_office必须是'17389551'。

如果在更新过程中出现错误,比如主键重复,可以考虑使用多个UPDATE语句来处理每个记录。但是,这可能会导致性能问题。

注意,使用这种方法更新时,如果记录的当前值与要更新的值相同,更新将不会执行。这对于避免不必要的更新非常有用。

这是一个在问题讨论中的示例对话,解释了问题的出现原因以及解决方法:

问题:当我尝试更新一个已经存在的记录时,MySQL给我报错:#1062 - Duplicate entry 'XXX' for key 'PRIMARY'。是否有办法在当前值与要更新的值相同时跳过更新?

回答:你可能有其他问题。如果cod_user是主键,并且值被重新排列,那么多次更新可能是最好的方式。

问题:是的,我明白了,实际的问题是存在多个助理,当尝试更新时,主键的完整性被破坏了。非常感谢你的时间。

问题:我使用你的代码时出现了错误。我通过修改WHERE子句中的'user_rol in ('student', 'assistant', 'admin')'来解决了问题,就像Hart CO建议的那样。

问题:如果其中一个更新由于唯一约束等原因失败,其他的INSERT语句会失败吗?

回答:是的,如果其中一个更新失败,其他的INSERT语句也会失败。

问题:请注意,这将使user_role字段对于不匹配三个条件的任何记录都设置为NULL。考虑在结束前添加一个ELSE,像这样:ELSE cod_user,这样如果它不匹配WHEN子句,它就会将字段设置为它自己。

问题:你能帮我简化我的命令吗?

问题:WHERE子句的最后一部分与原始查询不匹配:'AND cod_office = '17389551''应该是'AND cod_office = '123456''。

问题:不清楚为什么,但问题在几年后被更改了(由其他人)。你可以查看问题的编辑历史记录。

问题:为什么我们必须有WHERE子句,CASE语句不足以提供条件吗?

回答:问题的提问者想要更新由WHERE子句定义的特定一组行。这些列可能具有其他值。

问题:谢谢,我忽略了一个事实,我在我的项目中使用了Gordon的代码 - 另一个表结构(我的代码是基于树中的节点,在这个帮助下我可以在一个查询中交换两个节点的位置) - 我没有看太多实际的问题。无论如何,在我的代码中,我必须在WHERE子句中指定要交换的节点(id),即使CASE子句中已经提到了这些id。我首先尝试了没有WHERE子句,结果字段被设置为空,等等。

问题:在dba.stackexchange.com/questions/287028/…中提到了这种方法,感谢你的记录。它似乎比只执行每个记录的UPDATE要慢。我真的很希望在那个帖子上能得到关于性能方面的任何建议。

问题:从性能的角度来看,这种方法是否比每个记录执行一次UPDATE更好?

通过整理以上讨论内容,我们可以得出结论:在MySQL中,可以使用一次查询来更新多行的不同值。通过使用CASE语句将不同的值分配给相应的行,并在WHERE子句中指定要更新的行,可以实现这一目标。这种方法可以避免不必要的更新,并且在处理多个助理或其他可能违反主键完整性的情况时特别有用。然而,如果性能是一个关键问题,使用多个UPDATE语句可能是更好的选择。

0