Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL INSERT… ON DUPLICATE KEY UPDATE 완벽 가이드: 중복 키 오류 없이 데이터 처리하기

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)' 로직을 손쉽게 구현할 수 있습니다.