이런 코드는 다들 작성해봤지 않은가?.. (필자는 해서)
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
:음.... 조금 다른 점이 있으나 거의 유사하다 키워드도 같고.. 기술문서 링크로 대체한다.
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ㅜㅜ'
뭔가 문제에 당면하면 먼저 어떻게 처리할지 생각하는 것도 좋지만, 멀리 돌아가지 않기위해 한번 기술검토를 하는 습관을 들여야겠다!!.
'RDBMS' 카테고리의 다른 글
Mysql to Oracle 마이그레이션(SQL Developer Migration Workbench) / SQLDeveloper mysql connector 설정 (3) | 2020.06.08 |
---|