【问题标题】:Is it possible to update multiple records in a table with different values?是否可以用不同的值更新表中的多条记录?
【发布时间】:2021-10-14 05:53:14
【问题描述】:

我正在使用 SQL,我需要使用以下内容进行多次更新:

UPDATE databaseID SET count = 51 WHERE codCountry = "ES" AND file = "ES_IN.txt"
UPDATE databaseID SET count = 15 WHERE codCountry = "ES" AND file = "ES_DA.txt"
UPDATE databaseID SET count = 84 WHERE codCountry = "CO" AND file = "CO_SE.txt"
UPDATE databaseID SET count = 74 WHERE codCountry = "CO" AND file = "CO_TE.txt"

我的问题是,是否有可能做如下的事情,即在单个查询中更新表的多行?

UPDATE databaseID (SET count = 51 WHERE codCountry = "ES" AND file = "ES_IN.txt"), (SET count = 15 WHERE codCountry = "ES" AND file = "ES_DA.txt")...

【问题讨论】:

    标签: mysql sql sql-update case


    【解决方案1】:

    我会建议一个派生表和join:

    UPDATE databaseID d JOIN
           (SELECT 'ES' as codCountry, 'ES_IN.txt' as file, 15 as count UNION ALL
            SELECT 'CO' as codCountry, 'CO_SE.txt' as file, 51 as count UNION ALL
             . . .
           ) x
           USING (codCountry, file)        
        SET d.count = x.count;
    

    如果原始数据已经在表中,这就更简单了。然后你就可以使用那个表了。

    【讨论】:

    • 对于 mysql 8.0.19+ 或 mariadb 10.3.3+,您可以使用 VALUES 表构造函数(但遗憾的是,两者的语法和用法有所不同)
    【解决方案2】:

    使用CASE 表达式:

    UPDATE databaseID 
    SET count = CASE 
        WHEN codCountry = 'ES' AND file = 'ES_IN.txt' THEN 51 
        WHEN codCountry = 'ES' AND file = 'ES_DA.txt' THEN 15
        WHEN codCountry = 'CO' AND file = 'CO_SE.txt' THEN 84
        WHEN codCountry = 'CO' AND file = 'CO_TE.txt' THEN 74
        ELSE count
    END
    

    如果达到ELSE 部分,MySql 将不会真正更新该行。

    或者你可以添加一个WHERE 子句:

    UPDATE databaseID 
    SET count = CASE 
        WHEN codCountry = 'ES' AND file = 'ES_IN.txt' THEN 51 
        WHEN codCountry = 'ES' AND file = 'ES_DA.txt' THEN 15
        WHEN codCountry = 'CO' AND file = 'CO_SE.txt' THEN 84
        WHEN codCountry = 'CO' AND file = 'CO_TE.txt' THEN 74
    END
    WHERE (codCountry, file) IN 
      ('ES', 'ES_IN.txt'), ('ES', 'ES_DA.txt'), ('CO', 'CO_SE.txt'), ('CO', 'CO_TE.txt')
    

    并删除CASE 表达式的ELSE 部分。

    【讨论】:

    • 如何添加 WHERE 子句?
    • @print 在语句的末尾。
    • 是的,但我无法将其放入更新中
    • 我认为通过添加WHERE子句可以听到WHEN,我不明白现在添加WHERE子句有什么用?
    • @print 使用 WHERE 子句是为了过滤表以便处理更少的行。如果您不使用它,那么 UPDATE 语句将尝试根据 CASE 表达式中的条件更新表的所有行。如果不满足任何条件,则不会进行更新。在极端情况下,表的所有行都属于 4 个条件之一,则不需要 WHERE 子句。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多