본문 바로가기

Database

[ SQL ] MERGE INTO - INSERT & UPDATE 한번에 하기

 

 

MERGE INTO

: 필요한 한 개 또는 두 개의 테이블을 인라인 뷰로 가지고 와서 한 번에 UPDATE 또는 INSERT 하기 위해

  사용하는 것.

 

T SQL에서는 MERGE INTO를 쓰지 않아도 JOIN 문으로 UPDATE, INSERT, DELETE 를 할 수 있도록 되어있으나,

PL SQL 에서는 UPDATE, INSERT, DELETE를 JOIN 문으로 구성할 때 MERGE INTO 문을 사용한다.

 

MERGE INTO 문법

MERGE INTO TABLE_NAME
USING DUAL
ON ( 걸어줄 조건 )
WHEN MATCHED THEN
UPDATE SET 업데이트 할 내용
DELETE 삭제할 내용
WHEN NOT MATCHED THEN 
INSERT (테이블의 컬럼명 나열) VALUES 입력할 내용
;

 

  • 테이블 하나에 MERGE INTO 를 사용하는 경우에는 단순히 INSERT 또는 UPDATE를 한 번에 하고자 하는 것으로 USING 뒤에 DUAL을 써준다. 그렇지 않을 경우에는 JOIN 하고자 하는 테이블을 준다.
  • 걸어준 조건에 해당이 된다면 WHEN MATCHED THEN 뒤의 쿼리가 실행되고 그렇지 않을 경우 WHEN NOT MATCHED THEN 뒤의 쿼리가 실행된다.
  • WHEN NOT MATCHED THEN 은 꼭 쓰지 않아도 되지만 WHEN MATCHED THEN 을 쓰지 않고는 쓸 수 없다.
  • WHEN MATCHED THEN 뒤의 쿼리는 UPDATE 문 + DELETE 문 또는 UPDATE 문만 사용이 가능하며 WHEN NOT MATCHED THEN 뒤의 쿼리는 INSERT 문만 사용이 가능하다.
  • UPDATE, INSERT, DELETE 문이 따라올 때는 MERGE INTO + 테이블명을 상단에서 써주었으므로 써주지 않아도 되며 ON 후에 오는 조건 또한 UPDATE, INSERT, DELETE 문의 WHERE 절을 써준 것과 동일하게 적용되므로 주지 않아도 된다.

MERGE INTO 예시

 

1. 예시 테이블 만들기

TEST TABLE

CREATE TABLE TEST 
(
    T_ID    CHAR(3) 		NOT NULL,
    T_NAME  VARCHAR2(30)    NOT NULL
);

INSERT INTO TEST (T_ID, T_NAME) VALUES ('T01', '홍길동');
INSERT INTO TEST (T_ID, T_NAME) VALUES ('T02', '전우치');

SELECT * FROM TEST;

 

2. MERGE INTO 예시 1 - 조건이 해당될 경우 UPDATE 하기

상단 쿼리 실행 시

MERGE INTO TEST
USING DUAL
ON (T_ID = 'T02')
WHEN MATCHED THEN
UPDATE SET T_NAME = '김갑돌'
WHEN NOT MATCHED THEN
INSERT (T_ID, T_NAME) VALUES ('T03', '김갑순')
;

 

3. MERGE INTO 예시 2 - 조건에 해당되지 않을 경우 INSERT 하기

상단 쿼리 실행 시

MERGE INTO TEST
USING DUAL
ON (T_ID = 'T03')
WHEN MATCHED THEN
UPDATE SET T_NAME = '김갑돌'
WHEN NOT MATCHED THEN
INSERT (T_ID, T_NAME) VALUES ('T03', '김갑순')
;

 

4. MERGE INTO 예시 3 - 조건에 해당될 경우 DELETE 하기 

  ※ UPDATE 문 + DELETE 문으로만 사용 가능

상단 쿼리 실행 시

MERGE INTO TEST
USING DUAL
ON (T_ID = 'T02')
WHEN MATCHED THEN
UPDATE SET T_NAME = '김갑돌'
DELETE WHERE T_ID = 'T02'
WHEN NOT MATCHED THEN
INSERT (T_ID, T_NAME) VALUES ('T03', '김갑순')
;

 

 

주로 테이블 CRUD 에서 INSERT와 UPDATE를 한 번에 짜기 위해서 사용됨.