2012-02-20 83 views
10

与MySQL我使用这个查询:MYSQL更新集在同一列,但与多个WHERE子句

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) 

这个伟大的工程!由于

回答

13

像这样的东西应该为你工作:

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) 

另外,西蒙建议,你可以这样做,从输入值的两倍保存:

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/

+1

删除我的评论作为尝试这个和工作,很好:)作为一个说明,你可以添加“ELSE Category_ID”之前“结束”,如果你不想包括在哪里 – 2012-02-20 21:27:12

+0

谢谢。好点;它可以节省两次进入列的时间。 – 2012-02-20 21:29:28

+2

使用'WHERE'子句,您几乎可以确保能够使用Category_ID上的索引,也可以使用[safe-updates](http://dev.mysql.com/doc/refman/5.0/zh/) mysql-command-options.html#option_mysql_safe-updates)启用后,您必须输入带'UPDATE'的WHERE子句,所以'ELSE'子句可能不是最佳选择。坚持'WHERE'。 – 2012-02-20 21:39:47

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的新值和旧值之间是否有任何关联?

+0

我有超过300个不同类型:( – Monty 2012-02-20 21:21:43

+0

为什么那能改变什么?这是一次性查询,对吗?因此,请使用您计算机的复制/粘贴功能并制作一天。除非这些新价值与某些OLD价值冲突。那么你可能需要一个临时表或猎人的解决方案 – JohnFx 2012-02-20 21:22:57

+0

大多数不同,但有些是相同的。 – Monty 2012-02-20 21:28:29

1

你可以创建另一个表,在其中进行映射。如:

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

然后填写它...

然后

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