본문 바로가기

DataBase/Oracle

[ Oracle ] Oracle merge into

반응형

프로젝트를 진행하는 데에 있어서, 또는 버전을 관리하는 과정에 있어서 테이블의 데이터를 삽입하거나 업데이트 해야하는 경우들이 있다. 넣으려는 데이터가 있으면 insert하고 없으면 update하는 것이다.

 

이런 경우 유용하게 쓰이는 구문이 merge문이다. 

| 구조

MERTGE INTO 테이블A // 데이터를 insert하거나 update할 테이블
 USING 테이블B // 데이터를 가져올 테이블
    ON 제약조건
 WHEN MATCHED THEN
 	UPDATE문
 WHEN NOT MATCHED THEN
 	INSERT문

 

이해를 쉽게 하기 위해서 예를 들어보겠습니다. 다음과 같은 테이블과 데이터가 있다고 가정합니다.

 

USER_A 테이블

USER_ID (PK) USER_NAME USER_TEL
cocomong 코코몽 010-1111-2222

USER_B 테이블 

USER_ID (PK) USER_NAME USER_TEL
cocomong 코코몽 010-1111-2222
ggang 010-3333-4444

| 테이블 비교 구문

MERTGE INTO USER_A A
 USING USER_B B
    ON (A.USER_ID = B.USER_ID)
 WHEN MATCHED THEN
 	UPDATE SET 
    	A.USER_NAME = B.USER_NAME,
        A.USER_TEL = B.USER_TEL
 WHEN NOT MATCHED THEN
 	INSERT(A.USER_ID, A.USER_NAME, A.USER_TEL)
    VALUES(B.USER_ID, B.USER_NAME, A.USER_TEL)

 

위처럼 쿼리를 실행하면 cocomong 사용자는 데이터가 UPDATE될 것이고,

ggang 사용자는 데이터가 INSERT 될 것이다. 중요한 것은 테이블 구조는 동일해야한다.

| 하나의 테이블만 이용하는 구문

MERTGE INTO USER_A 
 USING DUAL
    ON (A.USER_ID = 'ggang')
 WHEN MATCHED THEN
 	UPDATE SET 
    	A.USER_NAME = B.USER_NAME,
        A.USER_TEL = B.USER_TEL
 WHEN NOT MATCHED THEN
 	INSERT(USER_ID, USER_NAME, USER_TEL)
    VALUES('ggang', '깡', '010-3333-4444')

 

위처럼 쿼리를 실행하면 USER_A에는 ggang 사용자가 없기 때문에 INSERT 문이 실행된다.

만약 USER_ID='cocomong' 이였다면 UPDATE 문이 실행되는 것이다.

| INSERT OR PASS

위의 두 가지 경우는 INSERT를 하거나 UPDATE를 한다. 하지만 데이터가 존재할 경우 UPDATE 하지 않고 PASS 하는 구문도 사용됩니다. 불필요한 UPDATE를 막기 위해서다.  INSERT문만 실행하고 넘어가는 것이다.

MERTGE INTO USER_A 
 USING DUAL
    ON (A.USER_ID = 'ggang')
 WHEN NOT MATCHED THEN
 	INSERT(USER_ID, USER_NAME, USER_TEL)
    VALUES('ggang', '깡', '010-3333-4444')

 

이상입니다. 도움이 돼셨다면 좋아요 꾸욱! 

 

mysql merge 바로가기

 

[ mysql ] merge update insert

프로젝트를 하다보면 oracle로 할 때가 있고 mysql로 할 때가 있다. 하지만 서로 쿼리가 다른 것들이 많다. 그 중 하나가 오늘 포스팅할 개념이다. 먼저 테이블을 생성합니다. | 테이블 생성 CREATE USER

im-codding.tistory.com

 

반응형