【问题标题】:MYSQL UPDATE SET on the Same Column but with multiple WHERE ClausesMYSQL UPDATE SET 在同一列但有多个 WHERE 子句
【发布时间】:2026-01-11 16:25:01
【问题描述】:

我正在使用 MYSQL 查询:

UPDATE CustomerDetails_COPY
SET Category_ID = 10
WHERE Category_ID = 2

没关系,但我想再向它添加 15 个以上的 SET/WHERE,例如:

UPDATE CustomerDetails_COPY
SET Category_ID = 9  WHERE Category_ID = 3
SET Category_ID = 12 WHERE Category_ID = 4
SET Category_ID = 11 WHERE Category_ID = 5
.....

我该如何添加?

编辑:

根据猎人的建议:

UPDATE CustomerDetails_COPY
    SET Category_ID = CASE Category_ID
        WHEN 2 THEN 10 
        WHEN 3 THEN 9
        WHEN 4 THEN 12
        WHEN 5 THEN 11
    END
WHERE Category_ID IN (2,3,4,5)

这很好用!谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这样的东西应该适合你:

    UPDATE CustomerDetails_COPY
        SET Category_ID = CASE Category_ID
            WHEN 2 THEN 10 
            WHEN 3 THEN 9
            WHEN 4 THEN 12
            WHEN 5 THEN 11
        END
    WHERE Category_ID IN (2,3,4,5)
    

    或者,正如 Simon 建议的那样,您可以这样做来避免输入两次值:

    UPDATE CustomerDetails_COPY
        SET Category_ID = CASE Category_ID
            WHEN 2 THEN 10 
            WHEN 3 THEN 9
            WHEN 4 THEN 12
            WHEN 5 THEN 11
            ELSE Category_ID
        END
    

    来源:http://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a-single-sql-query/

    【讨论】:

    • 删除了我的评论,因为尝试了这个并且有效,很好:) 作为说明,如果您不想包含 WHERE,可以在“END”之前添加“ELSE Category_ID”
    • 谢谢。一个好点;这样可以避免两次输入列。
    • 使用WHERE 子句,您几乎可以保证能够利用Category_ID 上的索引,同样启用safe-updates,您必须输入带有WHERE 子句的@987654327 @,所以ELSE 子句可能不是最佳选择。坚持WHERE
    • 我可以同时使用WHEREELSE 来帮助过滤掉正在更新的投影(如果有数十万或数百万条记录)并分别保存两次输入值?
    【解决方案2】:

    典型的做法是

    UPDATE CustomerDetails_COPY SET Category_ID = 10 WHERE Category_ID = 2
    UPDATE CustomerDetails_COPY SET Category_ID = 9  WHERE Category_ID = 3
    UPDATE CustomerDetails_COPY SET Category_ID = 12 WHERE Category_ID = 4
    UPDATE CustomerDetails_COPY SET Category_ID = 11 WHERE Category_ID = 5
    

    你有什么理由避免这种方法吗?

    category_ID的新旧值是否有关联?

    【讨论】:

    • 我有超过 300 种不同的类型:(
    • 为什么这会改变什么?这是一次性查询,对吧?因此,请使用您计算机的复制/粘贴功能并度过一天。当然,除非其中任何一个的新值与某些旧值冲突。那么你可能需要一个临时表或 Hunter 的解决方案
    • 大部分不同,但有些相同。
    • 有时为了处理php并发问题可能会出现多个单独的SQL Query执行的问题,因为mysql和php是不同的软件,当php执行SQL Query和mysql返回结果给php时可能会有执行下一个 SQL 查询之前的非常短的延迟。因为您可以使用事务来锁定表并立即执行,但是某些数据库引擎不支持事务,例如 MyISAM 引擎。所以我认为这就是为什么这里的问题发布在一个查询中执行它们
    【解决方案3】:

    您可以在其中创建映射的另一个表。例如:

    map_table
    -----------
    mani_id
    new_id
    

    然后填写...

    然后

    UPDATE CustomerDetails_Copy set category_id = (select new_id from map_table where mani_id = category_id )
    

    【讨论】:

      最近更新 更多