테이블에서 중복값 방지를 위한 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
'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 |