[Oracle] MERGE INTO 사용법 데이터가 있으면 UPDATE 없으면 INSERT
- DB/Oracle
- 2019. 11. 17.
MERGE문은 테이블에 원하는 데이터가 있으면 그 데이터를 UPDATE하고 없으면 INSERT하는 구문입니다. 이 문법 PK중복 문제 해결등 각종 문제 해결에 정말 유용하게 사용되는 문법입니다.
MERGE문 사용법
MERGE INTO 테이블명
USING 타겟 테이블
ON 타겟 데이터
WHEN MATCHED THEN
SET
컬럼1 = 값1,
컬럼2 = 값2,
...
WHERE 조건
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2 ...) VALUES (값1, 값2...)
WHERE 조건;
MERGE문의 기본 사용법은 위와 같습니다. 다른 DML보다 문법이 복잡한편이라 처음 접하면 사용하기 힘들수도 있다 생각됩니다. 이에 아래 간단한 예제를 준비했습니다.
MERGE문 예제
테스트 테이블 생성
CREATE TABLE TEST_TABLE (
COMPANY_CODE VARCHAR2(10) NOT NULL,--회사코드
COMPANY_NAME VARCHAR2(50) NOT NULL --회사이름
);
MERGE문을 실습하기 위해 간단한 테이블 하나를 생성했습니다. 테이블은 COMPANY_CODE(회사코드)와 COMPANY_NAME(회사이름)으로 이루어져있으며 테이블에 COMPANY_CODE가 '1' 이라는 데이터가 있으면 UPDATE 없으면 INSERT를 해보는 식으로 MERGE문을 만들어보도록 하겠습니다.
MERGE문 실행
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
UPDATE SET COMPANY_NAME = '삼성전자'
WHEN NOT MATCHED THEN
INSERT (COMPANY_CODE, COMPANY_NAME)
VALUES ('1','현대자동차');
위 쿼리를 한번 실행시키면 현대자동차라는 회사명의 데이터가 INSERT됩니다. 아무것도 없는 테이블에 타겟으로 한 COMPANY_CODE = '1' 이라는 데이터가 없으므로 INSERT문이 실행된것입니다. 그렇다면 이제 COMPANY_CODE = 1이라는 데이터가 있으니 이 쿼리를 한번 더 실행시키면 어떻게 될까요?
COMPANY_CODE = '1' 이라는 데이터가 있으므로 UPDATE문이 실행되어 COMPANY_NAME이 현대차에서 삼성전자로 UPDATE됩니다.
UPDATE문 / INSERT문 중 하나만 실행
--데이터가 없을경우에 INSERT
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN NOT MATCHED THEN
INSERT (COMPANY_CODE, COMPANY_NAME)
VALUES ('1','현대자동차');
--데이터가 있을 경우 UPDATE
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
UPDATE SET COMPANY_NAME = '삼성전자'
위와같이 UPDATE와 INSERT를 하나씩만 실행시켜 EXISTS를 쓰는것과 비슷한 느낌으로 사용할수도 있습니다.
데이터가 있을 경우 DELETE 없을 경우 INSERT
MERGE INTO TEST_TABLE
USING DUAL
ON (COMPANY_CODE = '1')
WHEN MATCHED THEN
UPDATE SET COMPANY_NAME = '삼성전자'
DELETE WHERE COMPANY_CODE = '1'
WHEN NOT MATCHED THEN
INSERT (COMPANY_CODE, COMPANY_NAME)
VALUES ('1','현대자동차');
UPDATE절에 DELETE문을 추가할 수도 있습니다. 이 방법은 UPDATE될 값을 평가해서 조건에 맞는 데이터를 삭제하는 역할을 합니다. 주로 위와 같이 데이터가 있을 경우 DELETE 없을 경우 INSERT로 사용됩니다.
데이터 이관
MERGE INTO TEST_TABLE A
USING EX_TABLE B
ON (A.COMPANY_CODE = B.COMPANY_CODE)
WHEN MATCHED THEN
UPDATE SET
A.COMPANY_NAME = B.COMPANY_NAME
WHEN NOT MATCHED THEN
INSERT (A.COMPANY_CODE,A.COMPANY_NAME)
VALUES (B.COMPANY_CODE,B.COMPANY_NAME);
MERGE문은 다양하게 활용됩니다. 테이블끼리 데이터를 이관할때도 유용하게 사용됩니다. 위 예제는 EX_TABLE에있는 데이터를 TEST_TABLE 테이블로 데이터를 이관하는 예제입니다.
'DB > Oracle' 카테고리의 다른 글
[Oracle] 문자열 자르기 / 구분자로 자르기 (SUBSTR, INSTR) 사용법 & 예제 (4) | 2019.11.19 |
---|---|
[Oracle] 데이터 존재여부를 확인하는 EXISTS / NOT EXISTS (1) | 2019.11.18 |
[Oracle] 오라클 DELETE문(삭제) 사용법 & 예제 (0) | 2019.11.16 |
[Oracle] 오라클 UPDATE문(수정) 사용법 & 예제 (0) | 2019.11.15 |