MySQL 중복 레코드 처리의 핵심: INSERT ON DUPLICATE KEY UPDATE
MySQL에서 데이터를 삽입할 때 중복 레코드로 인해 오류가 발생하는 것을 방지하고 기존 레코드를 자동으로 교체하려면 INSERT ON DUPLICATE KEY UPDATE 구문을 사용하는 것이 가장 효율적입니다. 이 구문은 새 레코드를 삽입하려다가 고유 키(UNIQUE KEY) 충돌이 발생하면, 오류를 내지 않고 지정된 값으로 해당 레코드를 업데이트합니다.
실제 동작 과정을 예제와 함께 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 Id와 Name 컬럼에 복합 UNIQUE 제약 조건을 설정한 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(20),
-> UNIQUE(Id,Name)
-> );
Query OK, 0 rows affected (0.78 sec)
2단계: ON DUPLICATE KEY UPDATE를 사용한 데이터 삽입
이제 insert 명령어에 on duplicate key update 절을 추가하여 레코드를 삽입합니다. 중복이 발견되면 자동으로 새로운 값으로 교체됩니다.
mysql> insert into DemoTable values(101,'Chris') on duplicate key update Id=10001,Name='Robert';
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(102,'Mike') on duplicate key update Id=10001,Name='Robert';
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(101,'Chris') on duplicate key update Id=10001,Name='Robert';
Query OK, 2 rows affected (0.10 sec)
위 실행 결과에서 주목할 점은 세 번째 쿼리입니다. (101, 'Chris')는 첫 번째 쿼리에서 이미 삽입된 값과 동일하므로 중복으로 판단되어, '2 rows affected' 메시지와 함께 기존 레코드가 Id=10001, Name='Robert'로 업데이트되었습니다.
3단계: 결과 확인
select 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+--------+
| Id | Name |
+-------+--------+
| 102 | Mike |
| 10001 | Robert |
+-------+--------+
2 rows in set (0.00 sec)
결과 분석 및 핵심 포인트
출력 결과를 보면 처음 삽입한 (101, 'Chris') 레코드가 사라지고 (10001, 'Robert')로 교체된 것을 확인할 수 있습니다. 즉, 세 번째 insert 문에서 UNIQUE(Id, Name) 조건에 걸려 중복 오류 대신 UPDATE가 실행된 것입니다.
INSERT ON DUPLICATE KEY UPDATE를 사용하면 다음과 같은 장점이 있습니다.
- 별도의 SELECT로 중복 여부를 확인할 필요 없이 한 번의 쿼리로 처리 가능
- 중복 키 충돌 시 발생하는 오류를 방지
- 애플리케이션 코드 없이 데이터베이스 수준에서 upsert(삽입 또는 수정) 로직 구현
- REPLACE INTO보다 삭제 후 재삽입 방식이 아니므로 불필요한 행 삭제가 없어 더 안전하고 효율적
따라서 MySQL에서 중복 레코드를 교체해야 하는 상황이라면 INSERT ON DUPLICATE KEY UPDATE가 가장 권장되는 방식입니다.