MySQL INSERT ... ON DUPLICATE KEY UPDATE 구문이란?
INSERT ... ON DUPLICATE KEY UPDATE는 MySQL에서 제공하는 매우 유용한 구문입니다. 새 레코드를 삽입하려고 할 때 UNIQUE 키 또는 PRIMARY KEY가 이미 존재하면 에러를 발생시키는 대신, 해당 레코드를 지정한 값으로 자동으로 업데이트해 줍니다. 덕분에 별도의 조회(SELECT) 과정 없이 삽입과 수정을 한 번의 쿼리로 처리할 수 있습니다.
기본 문법
insert into yourTableName values(yourValue1,yourValue2,...N)
on duplicate key update yourColumnName1=yourValue1,yourColumnName2=yourValue2,...N;
예제 1: 테이블 생성
먼저 EmployeeName 컬럼에 UNIQUE 키가 설정된 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1539
-> (
-> EmployeeName varchar(20),
-> EmployeeSalary int,
-> UNIQUE KEY(EmployeeName)
-> );
Query OK, 0 rows affected (0.62 sec)
예제 2: ON DUPLICATE KEY UPDATE를 활용한 레코드 삽입
이제 insert 명령에 on duplicate key update 절을 추가하여 레코드를 삽입합니다.
mysql> insert into DemoTable1539 values('Chris',4500) on duplicate key update EmployeeName='Robert',EmployeeSalary=8500;
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1539 values('David',5500) on duplicate key update EmployeeName='Robert',EmployeeSalary=8500;
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1539 values('Chris',4500) on duplicate key update EmployeeName='Robert',EmployeeSalary=8500;
Query OK, 2 rows affected (0.14 sec)세 번째 쿼리의 결과가 '2 rows affected'로 반환된 점에 주목하세요. 'Chris'라는 값이 이미 UNIQUE 키로 존재하기 때문에 새로운 삽입이 아니라 업데이트가 수행되었으며, 이 경우 영향받은 행 수가 2로 표시됩니다.
예제 3: 결과 확인
select 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1539;
실행 결과는 다음과 같습니다.
+--------------+----------------+
| EmployeeName | EmployeeSalary |
+--------------+----------------+
| Robert | 8500 |
| David | 5500 |
+--------------+----------------+
2 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 처음 삽입했던 'Chris'(4500) 레코드가 세 번째 쿼리 실행 시점에 중복 키 충돌을 일으켜 'Robert'(8500)로 업데이트된 것을 확인할 수 있습니다. 최종적으로 테이블에는 Robert(8500)와 David(5500), 두 개의 레코드만 남게 됩니다.
마무리 정리
INSERT ... ON DUPLICATE KEY UPDATE 구문은 흔히 말하는 UPSERT(삽입 또는 갱신) 작업을 단일 쿼리로 처리할 수 있게 해줍니다. 데이터 동기화, 조회수·카운터 증가처럼 중복 여부에 따라 다른 처리가 필요한 상황에서 코드를 크게 단순화해 주므로 실무에서 적극적으로 활용할 만합니다.