MySQL에서는 CASE 문을 활용하면 하나의 UPDATE 쿼리만으로 조건에 따라 각 레코드에 서로 다른 값을 설정할 수 있습니다. 이 글에서는 이름(FirstName) 값에 따라 ID를 다르게 변경하는 실제 예제를 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다. Id와 FirstName 두 개의 컬럼으로 구성된 간단한 테이블입니다.
mysql> create table DemoTable1545
-> (
-> Id int,
-> FirstName varchar(20)
-> );
Query OK, 0 rows affected (1.65 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 세 개의 레코드를 추가합니다.
mysql> insert into DemoTable1545 values(1,'John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1545 values(2,'Chris');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1545 values(3,'Bob');
Query OK, 1 row affected (0.15 sec)
3. 현재 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select * from DemoTable1545;
실행 결과는 다음과 같습니다.
+------+-----------+
| Id | FirstName |
+------+-----------+
| 1 | John |
| 2 | Chris |
| 3 | Bob |
+------+-----------+
3 rows in set (0.00 sec)
4. CASE 문으로 조건별 ID 일괄 변경
이제 핵심인 UPDATE 쿼리입니다. CASE 문 안에서 LIKE 연산자로 이름을 판별하고, 조건에 맞는 새로운 ID를 할당합니다. 어떤 조건에도 해당하지 않는 경우에는 else Id를 통해 기존 ID 값을 그대로 유지합니다.
mysql> update DemoTable1545
-> set Id=
-> case when FirstName like '%John%' then 101
-> when FirstName like '%Chris%' then 201
-> when FirstName like '%Bob%' then 501
-> else Id
-> end;
Query OK, 3 rows affected (0.18 sec)
Rows matched: 3 Changed: 3 Warnings: 0
5. 변경 결과 확인
업데이트 후 테이블을 다시 조회하여 결과를 확인합니다.
mysql> select * from DemoTable1545;
각 이름에 따라 ID가 의도한 대로 변경된 것을 볼 수 있습니다.
+------+-----------+
| Id | FirstName |
+------+-----------+
| 101 | John |
| 201 | Chris |
| 501 | Bob |
+------+-----------+
3 rows in set (0.00 sec)
정리
이처럼 MySQL의 CASE 문을 UPDATE 구문과 함께 사용하면, 여러 개의 개별 쿼리를 실행하지 않고도 단일 쿼리로 조건 기반의 대량 데이터 수정을 처리할 수 있습니다. 특히 else 절에 기존 컬럼 값을 지정하면 조건에 맞지 않는 레코드는 원래 값이 유지되므로, 의도치 않은 데이터 손실을 방지할 수 있다는 점도 기억해 두면 좋습니다.