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
。
我可以同时使用WHERE
和ELSE
来帮助过滤掉正在更新的投影(如果有数十万或数百万条记录)并分别保存两次输入值?【参考方案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更新多个记录
多个 UNIQUE 字段的 ON DUPLICATE KEY UPDATE 的 MySQL 行为