MYSQL UPDATE SET 在同一列但有多个 WHERE 子句

Posted

技术标签:

【中文标题】MYSQL UPDATE SET 在同一列但有多个 WHERE 子句【英文标题】:MYSQL UPDATE SET on the Same Column but with multiple WHERE Clauses 【发布时间】:2012-02-20 21:14:58 【问题描述】:

我正在使用 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)

这很好用!谢谢

【问题讨论】:

【参考方案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 )

【讨论】:

以上是关于MYSQL UPDATE SET 在同一列但有多个 WHERE 子句的主要内容,如果未能解决你的问题,请参考以下文章

MySQL InnoDB Engine--数据页存储和UPDATE操作

MySQL使用One Update Statement更新多个记录

Mysql update

多个 UNIQUE 字段的 ON DUPLICATE KEY UPDATE 的 MySQL 行为

mysql同一个表,将字段1和字段2内容相加,update到字段3

GROUP BY 一列但不是同一表中的另一列-SQL [重复]