반응형
프로젝트를 진행하는 데에 있어서, 또는 버전을 관리하는 과정에 있어서 테이블의 데이터를 삽입하거나 업데이트 해야하는 경우들이 있다. 넣으려는 데이터가 있으면 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 바로가기
반응형
'DataBase > Oracle' 카테고리의 다른 글
[ Oracle ] 오라클 DB 툴 접속 ORA-06552 ORA-06553 오류 (4) | 2020.06.13 |
---|---|
[ Oracle ] 오라클 사용자 계정 생성 ORA-65056 오류 (0) | 2020.06.13 |
[ Oracle ] 오라클 한글 깨짐 현상 (0) | 2020.06.13 |