DB

[Oracle] Key 중복 시 insert 대신 update 처리 (merge into)

후유증 2021. 6. 30. 16:11

테이블에서 중복값 방지를 위한 contraint가 걸려있을 경우, 중복 키값을 가진 row를 insert 하면 오류가 발생한다.

따라서 일반적인 방법으로는 insert를 하기 전 중복된 키를 가진 값이 이미 table에 존재하는지를 파악하고, 이미 존재할 경우 update를 하도록 구현하여아 한다.

하지만, 중복키 여부를 확인하기 위한 로직을 작성하지 않고도 쿼리 하나로 insert 또는 update를 수행하도록 설정할 수 있는 방법이 존재한다.

Oracle 공식 Document 를 참고하면, INSERT ON DUPLICATE KEY UPDATE 구문을 통해 처리할 수 있음을 확인할 수 있다.

 

 

MERGE

Prerequisites You must have the INSERT and UPDATE object privileges on the target table and the SELECT object privilege on the source table. To specify the DELETE clause of the merge_update_clause, you must also have the DELETE object privilege on the targ

docs.oracle.com

Syntax

MERGE INTO table_name
            USING (table | view | subquery) alias
                 ON (join condition)                                    
            WHEN MATCHED THEN
                     UPDATE SET col1 = val1[, ...]
            WHEN NOT MATCHED THEN
                     INSERT (column lists) VALUES (values);

예제

아래 SQL은 ID, NAME, BIRTH 세 column을 가지며, PK로 ID설정된 테이블 P가 있다고 가정할 때

MERGE INTO P
    USING dual
        ON (ID = 'AAA')
    WHEN NOT MATCHED THEN
        INSERT (ID, NAME, BIRTH)
        VALUES 'AAA', '홍길동', '2000-01-01')
    WHEN MATCHED THEN
        UPDATE SET
            NAME='홍길동',
            BIRTH='2000-01-01'           

위와 같은 쿼리를 작성할 수 있다.

ID가 'AAA'인 데이터가 없을 경우 (NOT MATCHED) INSERT를 통해 ID'AAA' 이며, NAME'홍길동', BIRTH'2000-01-01' 인 데이터가 삽입된다.

또한 이미 'AAA'인 데이터가 존재할 경우 (MATCHED), UPDATE를 통해 NAME'홍길동', BIRTH를 _'2000-01-01'_로 설정하며, 이외의 값은 유지한다.

타 DBMS

 

[MariaDB] Key 중복 시 insert 대신 update 처리 (INSERT ON DUPLICATE KEY UPDATE)

테이블에서 중복값 방지를 위한 contraint가 걸려있을 경우, 중복 키값을 가진 row를 insert 하면 오류가 발생한다. 따라서 일반적인 방법으로는 insert를 하기 전 중복된 키를 가진 값이 이미 table에 존

blog.rixa.kr