본문 바로가기

RDBMS

[ORACLE] MERGE INTO 문법 (MYSQL 도.. :D)

반응형

이런 코드는 다들 작성해봤지 않은가?.. (필자는 해서)

 

selectResultSize = DB 조회 결과 값;

if( selectResultSize > 0 ){

   update();

} else {

   insert();

}

 

위 같은 코드를 만드는 이유는

1. 두 개의 테이블을 비교해서 insert 또는 update

2. 한 개의 테이블의 특정 컬럼에 값 유무에 따른 insert 또는 update

 

위처럼 DB 처리가 필요한 상황일때, merge into 문법을 사용하면 편리하게 기능을 구현할 수 있어 간단한 내용으로 정리한다.

 

MERGE INTO 기본 문법

MERGE INTO table_name alias
            USING (table | view | subquery) alias                -- 하나의 테이블만 이용한다면 DUAL 활용
                 ON (join condition)                                     -- WHERE절에 조건 쓰듯이
            WHEN MATCHED THEN                                   -- ON 이하의 조건에 해당하는 데이터가 있는 경우 
                     UPDATE SET col1 = val1[, ...]                -- UPDATE 실행
            WHEN NOT MATCHED THEN                           -- ON 이하의 조건에 해당하는 데이터가 없는 경우
                     INSERT (column lists) VALUES (values);  -- INSERT 실행

 

설명처럼 하나의 테이블에서 특정 조건에 따라서 update, insert를 한다면 dual 로 table을 지정할 수 있다.

mathced, not matched 조건때 테이블은 merge into ~ 에서 정해졌기 때문에 테이블 명시는 하지 않아도 된다.

 

1. 두 개 테이블

MERGE INTO USER U
            USING USER_TEMP T
            ON (U.userkey = T.userkey)
            WHEN MATCHED THEN
                      UPDATE SET
                            U.name = T.name,
                            U.age = T.age,
                            U.email = T.email,
                            ......
            WHEN NOT MATCHED THEN
                      INSERT (U.name, U.age, U.email, ...... ) 
                                 VALUES (T.name, T.age, T.email, ...... );

 

2. 한 개의 테이블

MERGE INTO USER U
            USING DUAL
            ON (U.name = '글쓴이')
            WHEN MATCHED THEN
                      UPDATE SET
                             U.age = '29',
                             U.job = 'programmer'
                            
            WHEN NOT MATCHED THEN
                      INSERT (U.userkey, U.name, U.age, U.job) 
                                 VALUES (USER_SEQ.nextval, '글쓴이', '29', 'programmer');

 

※주의 on 으로 조건에 사용되는 컬럼은 update 항목에서 사용하여 해당 컬럼의 값을 변경할 수 없다.

또, Oracle 10g 이후에는 When matched,, when not matched 이하의 update,insert 구문에도 where을 사용할 수 있다고 한다.

 

다른 RDBMS는 어떻게 처리하는지 궁금했다.

 

MSSQL

:음.... 조금 다른 점이 있으나 거의 유사하다 키워드도 같고.. 기술문서 링크로 대체한다.

 

 

MERGE(Transact-SQL) - SQL Server

MERGE(Transact-SQL)MERGE (Transact-SQL) 이 문서의 내용 --> 적용 대상: SQL Server Azure SQL Database Azure Synapse Analytics(SQL DW) 병렬 데이터 웨어하우스 APPLIES TO: SQL Server Azure SQL Database Azure Synapse Analytics (SQL DW) Parallel Data Warehouse 원본 테이블과의 조인 결과를 기반으로 대

docs.microsoft.com

 

MYSQL

: Mysql 은 MERGE INTO 를 지원하지않는다! 하지만 마찬가지로 MYSQL에도 MERGE INTO 문법과 같은 기능을 사용할 수 있었다.

 

기본 Insert 문에서 추가만 해주면 된다.

기본조건은 테이블에 PK가 있어야하며, PK를 기준으로 중복시에 Duplicate key 하위의 쿼리를, 중복되지 않을시 위의 Insert 쿼리를 실행한다.

 

1. 두 개의 테이블

INSERT INTO USER(USERKEY, NAME, AGE)
	SELECT USER_SEQ.NEXTVAL,
		U.USERKEY,
		U.NAME,
		T.AGE
	FROM
		USER U,
		USER_TEMP T
	WHERE 
		U.USERKEY = T.USERKEY
	ON DUPLICATE KEY UPDATE
		AGE = T.AGE

 

2. 한 개의 테이블

INSERT INTO USER (
userkey,
name,
age
)
VALUES (
'12345',
'글쓴이',
'29'
)
ON
DUPLICATE KEY
UPDATE
age = '29ㅜㅜ'

 

뭔가 문제에 당면하면 먼저 어떻게 처리할지 생각하는 것도 좋지만, 멀리 돌아가지 않기위해 한번 기술검토를 하는 습관을 들여야겠다!!.

반응형