출처 : https://stackoverflow.com/questions/11664684/how-to-bulk-update-mysql-data-with-one-query


$query = mysql_query("UPDATE a SET fruit = '**apple**' WHERE id = '**1**' ");

$query2 = mysql_query("UPDATE a SET fruit = '**orange**' WHERE id = '**2**' ");

$query3 = mysql_query("UPDATE a SET fruit = '**peach**' WHERE id = '**3**' ");


이러한 쿼리가 많을때, DB 부하를 줄이면서 업데이트할 수 있는 방법은?


UPDATE a 

SET fruit = (CASE id WHEN 1 THEN 'apple'

                     WHEN 2 THEN 'orange'

                     WHEN 3 THEN 'peach'

             END)

WHERE id IN(1,2 ,3);



참고하면 좋은 글

http://blog.bubble.ro/how-to-make-multiple-updates-using-a-single-query-in-mysql/



==========================================


예를 들면 아래와 같은 Table이 있다고 했을때 Korea를 America로, America를 Korea으로 바꾸려고 한다면.....

[Table Name] National
==========================
Field1      Field2
==========================
1           Korea
2           America
3           England
4           Japan
...         ...

예전에 내가 사용한 방법

update national set field2 = 'America' where field1 = 1;
update national set field2 = 'Korea' where field1 = 2;

Update 구문을 두번 사용했다. -,.-; 그나마 변경할 레코드가 2개일땐 그렇다 쳐도 변경할 레코드가 죠낸 많아진다면, update 구문을 죠낸 남발해야 하는 경우가 생기는 것이다. 

게다가 위에 구문을 성공하고 난 후에, 아래의 쿼리가 실패하게 되면 죠낸 안습인 상황이 되게 되는 것이다. 레코드에 America만 두개가 되는 상황... -,.-;;;

이 방법을 어찌 해결할 방법이 없을까 "mysql.org"를 뒤지다가 알게된 "CASE"문.... 어둠속에서 한줄기 빛을 보게 된 느낌이다. 

CASE문의 기본 문법은 다음과 같다.

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

자.. 그럼 저 CASE문을 활용해서 UPDATE 구문을 하나로 바꿔보자....

UPDATE national set field2 = CASE 
   WHEN field1 = 1 THEN "America"
   WHEN field1 = 2 THEN "Korea"
ELSE
  field2
END;

2개의 update 구문이 하나로 줄어들었다. 게다가 값을 바꾸는 SWAP같은 경우에도 문제없이 처리할 수 있게 되었다. 단 여기서 한가지 주의할게 있는데, ELSE 다음에 field2는 반드시 필요한 구문이다. 그렇게 해주지 않으면, WHEN 조건절에 해당하지 않게되는 레코드의 field2의 값은 null값이 입력되게 될테니 말이다. 

여기에 추가로 해주는 작업이 WHERE 구문.... WHERE 구문을 통해 범위를 좁혀주면 완벽한 DATA SWAP이 이뤄지게 된다.

자.. 최종적으로 사용된 형태를 살펴볼까나?

UPDATE national set field2 = CASE 
   WHEN field1 = 1 THEN "America"
   WHEN field1 = 2 THEN "Korea"
ELSE
  field2
END
WHERE field1 in (1, 2);