'이가 없으면 잇몸으로 살겠다'_며 Postgresql의 merge문이 없음을 한탄하며 UPSERT
썼던 이 글을 쓴지도 벌써 어연 4년이 지난 지금...!
PostgreSQL 15 릴리즈 부터 Merge
문을 공식적으로 지원하기 시작했다!
아니 이놈들아~ 하면 되잖여~ 이걸 왜 이제 해줬냐며~~
아무튼 신나는 마음으로 궁디빵디를 흔들며 호다닥 공식 문서를 읽으러 들어가보자😙🥳
✔️ 공식 문서에 따르면 15버전 이하의 버전에서는 아직 INSERT ... ON CONFLICT
구문을 사용하여
UPSERT
문을 써서 사용해야한다고 공지하고 있으니, 현재 개발하는 환경의 DB버전을 꼭 확인해보고 쓰자!
문법(Syntax)
Merge 구문은 이미 오라클을 썼던 분들이라면 익숙할테지만 한번 더 톺아보고 가자.
MERGE INTO target_table
USING source_query
ON merge_condition
WHEN MATCH [AND condition] THEN {merge_update | merge_delete | DO NOTHING }
WHEN NOT MATCHED [AND condition] THEN { merge_insert | DO NOTHING };
MERGE INTO
+ 타겟이 되는 테이블의 명USING
+ 비교대상 테이블명 +ON
+ 비교 조건WHEN MATCH
+ 매칭되었을 때의 동작 (주로 update/delete 사용)WHEN NOT MATCHED
+ 매칭되지 않았을 때의 동작 (주로 insert 사용)
Merge
문을 쓰는 환경은 대체로 테이블에 데이터가 이미 있으면 업데이트(또는 삭제)하고, 없으면 값을 새로 넣어줘야 하는 경우에 사용한다.
설명
그렇기에 필요한 테이블은 타겟 대상 테이블(target\_table
)과 비교 대상(source\_query
)이 필요하다.
두 대상에 대하여 비교 조건을 ON
절에 작성하여 비교하여,
일치하는게 있다면(WHEN MATCH THEN
) 업데이트 또는 삭제를,
일치하는게 없다면(WHEN NOT MATCHED THEN
) row의 신규추가를 한다는 의미로 사용하면 된다.
코드 예제
예를 들어, 아래의 DDL에서와 같은 두 개의 테이블을 생성하였을 때 leads 테이블에 2개의 rows가 있다고 가정하자.
CREATE TABLE leads(
lead_id serial PRIMARY key,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
active bool NOT NULL DEFAULT TRUE
);
CREATE TABLE customers(
customer_id serial PRIMARY key,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
active bool NOT NULL DEFAULT TRUE
);
-- Table : leads
lead_id | name | email | active
---------+----------+--------------------+--------
1 | John Doe | john.doe@gmail.com | t
2 | Jane Doe | jane.doe@yahoo.com | t
(2 rows)
이 때, leads 테이블에 customers 테이블과 동일한 이메일을 사용하는 회원정보가 있다면 업데이트를 하고, 그렇지 않다면 데이터를 추가하고 할 때 Merge 문은 아래와 같은 구문으로 작성할 수 있다.
MERGE INTO customers c
USING leads l ON c.email = l.email
WHEN NOT MATCHED THEN
INSERT (name, email)
VALUES(l.name, l.email)
WHEN MATCHED THEN
UPDATE SET
name = l.name,
email = l.email;
그동안 Postgresql의 사용자였다면 이번 기회에 merge문도 활용해보고,
처음 접해보는 사람이라면 Merge문은 생각보다 현업에서도 자주 사용하는 구문이니 꼭 알아두고 활용해보자! 😎👌
'Database' 카테고리의 다른 글
[Database] Stored Procedure란? 개념과 장담점 알아보기 (0) | 2024.04.04 |
---|---|
날짜 타입, Timestamp와 Datetime의 차이 알아보기 (0) | 2021.12.27 |
[PostgresQL] 중복데이터 제거하고 하나만 남기기 (1) | 2021.11.28 |
[PostgreSQL] Returning 문법으로 Row 정보 리턴 받기 (0) | 2021.11.23 |
[PotsgresQL] 이 없으면 잇몸으로! MERGE 대신 UPSERT 사용하기 (0) | 2021.11.23 |