ON DUPLICATE KEY UPDATE로 삽입과 업데이트 동시 처리하기
네, 가능합니다. MySQL에서는 ON DUPLICATE KEY UPDATE 절을 사용하면 하나의 쿼리에서 삽입(INSERT)과 업데이트(UPDATE)를 동시에 처리할 수 있습니다. 이 절은 새 레코드를 삽입하려는 시점에 기본 키(PRIMARY KEY)나 고유 키(UNIQUE KEY)가 중복될 경우, 에러를 발생시키는 대신 해당 조건에 맞게 기존 레코드를 업데이트합니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable(Id int NOT NULL PRIMARY KEY, Number int);
Query OK, 0 rows affected (0.83 sec)
2. 레코드 삽입 및 업데이트
insert 명령어에 ON DUPLICATE KEY UPDATE 절을 추가하여 레코드를 삽입합니다. 아래 예제에서는 중복 키가 발생하면 기존 Number 값에 10을 더하도록 설정했습니다.
mysql> insert into DemoTable values(1,190) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(2,130) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(1,190) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 2 rows affected (0.14 sec)
mysql> insert into DemoTable values(2,130) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 2 rows affected (0.17 sec)
여기서 주목할 점은 영향받은 행(affected rows)의 개수입니다. 1 row affected는 새 레코드가 삽입되었음을 의미하고, 2 rows affected는 기존 레코드가 업데이트되었음을 나타냅니다.
3. 결과 확인
select 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다. Id 1과 2는 두 번째 insert 시점에 이미 존재했기 때문에 삽입 대신 Number 값이 각각 190→200, 130→140으로 10씩 증가했습니다. 즉, 하나의 쿼리에서 삽입과 업데이트가 모두 정상적으로 처리된 것입니다.
+----+--------+
| Id | Number |
+----+--------+
| 1 | 200 |
| 2 | 140 |
+----+--------+
2 rows in set (0.00 sec)
이처럼 ON DUPLICATE KEY UPDATE 절을 활용하면 애플리케이션 코드에서 존재 여부를 확인하는 별도의 SELECT 쿼리 없이도, 단일 SQL 문으로 삽입 또는 업데이트 로직을 깔끔하게 구현할 수 있습니다.