테이블에서 중복값 방지를 위한 contraint가 걸려있을 경우, 중복 키값을 가진 row를 insert 하면 오류가 발생한다.
따라서 일반적인 방법으로는 insert를 하기 전 중복된 키를 가진 값이 이미 table에 존재하는지를 파악하고, 이미 존재할 경우 update를 하도록 구현하여아 한다.
하지만, 중복키 여부를 확인하기 위한 로직을 작성하지 않고도 쿼리 하나로 insert 또는 update를 수행하도록 설정할 수 있는 방법이 존재한다.
Oracle 공식 Document 를 참고하면, INSERT ON DUPLICATE KEY UPDATE
구문을 통해 처리할 수 있음을 확인할 수 있다.
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
'DB' 카테고리의 다른 글
[MariaDB] Key 중복 시 insert 대신 update 처리 (INSERT ON DUPLICATE KEY UPDATE) (0) | 2021.06.30 |
---|---|
[mysql/mariadb] Database export 하기 (db dump) (0) | 2019.06.21 |
[MSSQL] 외래키가 지정된 Table에 Truncate하기 (0) | 2019.05.18 |