본문 바로가기

DataBase

[MySQL] On Duplicate Key Update

반응형

DB와 연동되는 프로그램을 개발하다보면 가끔씩 다음과 같은 일이 발생한다
"데이터가 있으면 Update, 없을경우 Insert"

위와 같은일이 종종 발생하는일은 아니지만 아주 가끔씩 위와 같은 요구가 발생하는데
아주 꼬꼬마 개발자 시절에는 위와 같은 방법을 다음과 같이 처리했다.

1. 데이터 조회
2. insert / update 분기 처리
3. 쿼리 실행

그러다가 시간이 조금 지나고 나서는 아래처럼 처리했다.

1. update 후 변경된 레코드 수 확인
2. update된 레코드가 없을경우 insert


select 쿼리를 빼버리고 바로 update를 실행하면 영향받은 레코드 개수를 리턴받을수 있는데, 리턴개수가 0일 경우 insert로 처리하는 방식이다.


평상시엔 위와 같이 처리해도 큰 문제는 없으나, 데이터 양이 많고 빠른 속도를 내야하는 과정이라면 MySQL에서 제공하는 On Duplicate Key Update 구문을 추천한다.



Uplicate Key Update는 오라클의 Merge와 비슷하다. SQL 한 구문에서 insert, update를 할 수 있게끔 해준다.

PK가 제대로 지정만 되어 있다면 해당 구문을 통해서 적절하게 insert, update가 이루어진다.
즉, PK로 지정된 데이터가 있으면 update, 없으면 insert를 진행한다.


아래 쿼리에서 uid가 PK라고 가정 할 경우 아래와 같이 사용하면 된다.

Insert Into
    TB_test
        (uid, name, age)
 Values
    ('527', '홍길동', '28')
 On Duplicate Key Update
    name = '홍길동'
    , age = '28' ;


On Duplicate Key Update 구문 밑으로 PK를 제외한 나머지 값들을 update set에서 나열하는것처럼 작성해 주면 된다.