MySQL에서 새로운 행(row)을 테이블에 삽입할 때, 해당 행이 UNIQUE 인덱스나 PRIMARY KEY와 중복되면 오류가 발생합니다. 이런 상황에서는 ON DUPLICATE KEY UPDATE 절을 사용하면 문제를 깔끔하게 해결할 수 있습니다. INSERT 문에 이 절을 함께 사용하면, 중복이 감지될 경우 새 행을 추가하는 대신 기존 행이 지정된 값으로 자동 업데이트됩니다.
아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.61 sec)
2단계: 고유(UNIQUE) 인덱스 생성하기
중복 여부를 판단할 기준이 되는 유니크 인덱스를 Value 컬럼에 생성합니다.
mysql> create unique index value_index on DemoTable(Value);
Query OK, 0 rows affected (0.77 sec)
Records: 0 Duplicates: 0 Warnings: 0
3단계: ON DUPLICATE KEY UPDATE로 데이터 삽입하기
이제 ON DUPLICATE KEY UPDATE 절을 포함한 INSERT 문으로 레코드를 삽입합니다. 중복된 값(40)을 다시 삽입하는 세 번째 쿼리에서 주목하세요. 새로운 행이 추가되지 않고, 기존 행의 값이 Value = Value + 1000 연산에 따라 갱신됩니다.
mysql> insert into DemoTable values(40) on duplicate key update Value=Value+1000;
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(50) on duplicate key update Value=Value+1000;
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(40) on duplicate key update Value=Value+1000;
Query OK, 2 rows affected (0.15 sec)
4단계: 결과 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+
| Value |
+-------+
| 50 |
| 1040 |
+-------+
2 rows in set (0.00 sec)
결과를 보면 값 50은 그대로 저장되었고, 중복으로 삽입된 값 40은 기존 행에서 40 + 1000 = 1040으로 업데이트된 것을 확인할 수 있습니다. 이처럼 ON DUPLICATE KEY UPDATE를 활용하면 별도의 SELECT 후 분기 처리 없이, 하나의 쿼리로 '삽입 또는 업데이트(upsert)' 로직을 손쉽게 구현할 수 있습니다.