MySQL에서는 CASE 명령을 활용하면 여러 개의 UPDATE 쿼리를 실행하지 않고도 단 하나의 쿼리로 여러 행의 데이터를 일괄 업데이트할 수 있습니다. 조건별로 서로 다른 값을 지정해야 할 때 특히 유용한 방법입니다.
CASE를 이용한 일괄 업데이트 기본 문법
UPDATE yourTableName
SET yourUpdateColumnName = (
CASE yourConditionColumnName
WHEN Value1 THEN 'UpdatedValue1'
WHEN Value2 THEN 'UpdatedValue2'
...
N
END
)
WHERE yourConditionColumnName IN(Value1, Value2, ..., N);이 문법의 핵심은 CASE 표현식이 조건 컬럼의 각 값에 따라 다른 업데이트 값을 반환하고, WHERE ... IN(...) 절이 대상 행만 정확히 선택한다는 점입니다.
예제 테이블 생성하기
개념을 이해하기 위해 먼저 예제용 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE UpdateAllDemo
-> (
-> BookId int,
-> BookName varchar(200)
-> );
Query OK, 0 rows affected (1.18 sec)샘플 데이터 삽입하기
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> INSERT INTO UpdateAllDemo VALUES(1000, 'Introduction to C'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO UpdateAllDemo VALUES(1001, 'Introduction to Java'); Query OK, 1 row affected (0.21 sec)
현재 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> SELECT * FROM UpdateAllDemo;
실행 결과는 다음과 같습니다.
+--------+----------------------+ | BookId | BookName | +--------+----------------------+ | 1000 | Introduction to C | | 1001 | Introduction to Java | +--------+----------------------+ 2 rows in set (0.00 sec)
CASE 문으로 일괄 업데이트 실행하기
이제 두 개의 값을 한 번의 쿼리로 변경해 보겠습니다.
- 'Introduction to C' → 'C in Depth'
- 'Introduction to Java' → 'Java in Depth'
앞서 설명한 CASE 명령을 적용한 쿼리는 다음과 같습니다.
mysql> UPDATE UpdateAllDemo
-> SET BookName = (
-> CASE BookId
-> WHEN 1000 THEN 'C in Depth'
-> WHEN 1001 THEN 'Java in Depth'
-> END
-> )
-> WHERE BookId IN(1000, 1001);
Query OK, 2 rows affected (0.24 sec)업데이트 결과 검증하기
SELECT 문으로 데이터가 실제로 변경되었는지 확인합니다.
mysql> SELECT * FROM UpdateAllDemo;
아래 출력 결과를 통해 두 레코드가 성공적으로 일괄 업데이트되었음을 알 수 있습니다.
+--------+---------------+ | BookId | BookName | +--------+---------------+ | 1000 | C in Depth | | 1001 | Java in Depth | +--------+---------------+ 2 rows in set (0.00 sec)
주의 사항 및 팁
단일 쿼리 일괄 업데이트를 안전하게 사용하려면 다음 사항을 기억하세요.
- WHERE 절 생략 금지: WHERE 절을 빼먹으면 테이블의 모든 행이 업데이트 대상이 되며, CASE 조건에 해당하지 않는 행은 NULL로 설정될 수 있습니다.
- ELSE 절 활용: 예상치 못한 값이 들어올 경우를 대비해
ELSE yourConditionColumnName처럼 원래 값을 유지하도록 ELSE 절을 추가하면 더욱 안전합니다. - 성능 장점: 개별 UPDATE 문을 여러 번 실행하는 것보다 네트워크 왕복 횟수가 줄어들어 대량 데이터 처리 시 성능상 이점이 있습니다.