
Oracle에서 데이터를 저장하다 보면 기존 데이터가 있으면 UPDATE하고, 없으면 INSERT해야 하는 경우가 자주 발생합니다.
이런 작업을 SELECT로 존재 여부를 확인한 뒤 UPDATE 또는 INSERT를 각각 실행할 수도 있지만, Oracle에서는 MERGE문을 사용하면 하나의 SQL로 처리할 수 있습니다.
MERGE는 흔히 UPSERT(UPDATE + INSERT) 라고도 불리며, 데이터 동기화나 배치 프로그램에서 많이 사용되는 기능입니다.
이번 글에서는 Oracle MERGE 문의 기본 문법과 실제 사용 예제, 사용 시 주의해야 할 사항을 정리해보겠습니다.
Oracle MERGE란?
MERGE는 대상 테이블과 기준 데이터를 비교하여 조건에 따라 UPDATE 또는 INSERT를 수행하는 SQL 문입니다.
데이터가 존재하면 UPDATE를 수행하고, 존재하지 않으면 INSERT를 수행합니다.
기본 구조는 다음과 같습니다.
MERGE INTO TARGET_TABLE T
USING SOURCE_TABLE S
ON (T.ID = S.ID)
WHEN MATCHED THEN
UPDATE SET
T.NAME = S.NAME,
T.AGE = S.AGE
WHEN NOT MATCHED THEN
INSERT (
ID,
NAME,
AGE
)
VALUES (
S.ID,
S.NAME,
S.AGE
);
MERGE 문 구성
MERGE 문은 크게 네 가지 요소로 구성됩니다.
- MERGE INTO : 데이터를 수정하거나 추가할 대상 테이블
- USING : 비교할 기준 데이터 또는 테이블
- ON : 두 데이터를 비교할 조건
- WHEN MATCHED / WHEN NOT MATCHED : 조건에 따른 처리 방식
이 네 가지를 이해하면 대부분의 MERGE 문을 쉽게 읽고 작성할 수 있습니다.
UPDATE만 수행되는 경우
기존 데이터가 존재하면 UPDATE만 수행됩니다.
예를 들어 사원 번호가 같은 경우 이름과 부서를 수정하려면 다음과 같이 작성할 수 있습니다.
MERGE INTO EMP T
USING (
SELECT
1001 AS EMPNO,
'홍길동' AS ENAME,
'개발팀' AS DEPT
FROM DUAL
) S
ON (T.EMPNO = S.EMPNO)
WHEN MATCHED THEN
UPDATE SET
T.ENAME = S.ENAME,
T.DEPT = S.DEPT;
사원 번호가 이미 존재하면 INSERT는 수행되지 않고 UPDATE만 실행됩니다.
INSERT가 수행되는 경우
기준 데이터가 대상 테이블에 존재하지 않으면 INSERT가 수행됩니다.
MERGE INTO EMP T
USING (
SELECT
1002 AS EMPNO,
'김철수' AS ENAME,
'인사팀' AS DEPT
FROM DUAL
) S
ON (T.EMPNO = S.EMPNO)
WHEN NOT MATCHED THEN
INSERT (
EMPNO,
ENAME,
DEPT
)
VALUES (
S.EMPNO,
S.ENAME,
S.DEPT
);
UPDATE와 INSERT를 함께 처리하기
실무에서는 대부분 아래와 같이 두 조건을 함께 사용하는 경우가 많습니다.
MERGE INTO EMP T
USING NEW_EMP S
ON (T.EMPNO = S.EMPNO)
WHEN MATCHED THEN
UPDATE SET
T.ENAME = S.ENAME,
T.DEPT = S.DEPT
WHEN NOT MATCHED THEN
INSERT (
EMPNO,
ENAME,
DEPT
)
VALUES (
S.EMPNO,
S.ENAME,
S.DEPT
);
이 방식은 데이터를 동기화하거나 배치 프로그램에서 자주 사용됩니다.
MERGE 사용 시 주의할 점
1. ON 조건은 반드시 하나의 행만 매칭되어야 합니다.
ON 조건으로 여러 행이 동시에 매칭되면 오류가 발생할 수 있습니다.
기준이 되는 컬럼은 PK 또는 UNIQUE 컬럼을 사용하는 것이 안전합니다.
2. UPDATE와 INSERT를 모두 수행하는 구조인지 확인합니다.
실수로 WHEN NOT MATCHED를 작성하지 않으면 신규 데이터는 등록되지 않습니다.
반대로 WHEN MATCHED가 없다면 기존 데이터는 수정되지 않습니다.
3. 다양한 데이터 관리 작업에 활용됩니다.
MERGE는
- 쇼핑몰 회원 정보 업데이트
- 상품 정보 동기화
- 재고 수량 갱신
- 주문 상태 변경
- 외부 시스템에서 받은 데이터를 기존 테이블에 반영
등 다양한 데이터 관리 작업에서 많이 사용됩니다.
DELETE와 MERGE 차이
| 명령 | 용도 |
|---|---|
| INSERT | 신규 데이터 추가 |
| UPDATE | 기존 데이터 수정 |
| DELETE | 데이터 삭제 |
| MERGE | UPDATE와 INSERT를 한 번에 처리 |
MERGE는 기존 데이터의 존재 여부를 확인하여 적절한 작업을 수행해야 하는 경우 가장 적합한 명령입니다.
요약
Oracle MERGE는 기존 데이터가 있으면 UPDATE, 없으면 INSERT를 하나의 SQL로 처리할 수 있는 명령입니다. 데이터 동기화나 배치 프로그램에서 자주 사용되며, MERGE INTO, USING, ON, WHEN MATCHED, WHEN NOT MATCHED의 구조를 이해하면 다양한 상황에 활용할 수 있습니다.
자주 묻는 질문(FAQ)
Q. Oracle MERGE는 UPSERT와 같은 의미인가요?
네. MERGE는 기존 데이터가 있으면 UPDATE, 없으면 INSERT를 수행하는 방식으로 일반적으로 UPSERT라고 부릅니다.
Q. MERGE를 사용할 때 ON 조건은 무엇으로 작성해야 하나요?
일반적으로 Primary Key(PK)나 Unique Key처럼 중복되지 않는 컬럼을 사용하는 것이 좋습니다. 하나의 기준 데이터가 여러 행과 매칭되면 오류가 발생할 수 있습니다.
Q. MERGE가 UPDATE보다 빠른가요?
속도 자체가 항상 더 빠른 것은 아닙니다. 다만 기존 데이터 확인과 UPDATE, INSERT를 하나의 SQL로 처리할 수 있어 데이터 동기화 작업에서 효율적으로 사용할 수 있습니다.
Q. MERGE에서 DELETE도 가능한가요?
가능합니다. WHEN MATCHED THEN UPDATE절 뒤에 DELETE WHERE를 추가하여 조건에 맞는 데이터를 삭제할 수 있습니다. 다만 사용 빈도는 UPDATE와 INSERT에 비해 낮습니다.
함께 보면 좋은 Oracle 글
