1. MERGE 문이란?
MERGE 문은 데이터베이스에서 데이터를 삽입(INSERT), 업데이트(UPDATE), 삭제(DELETE)를 한 번의 SQL 문으로 수행할 수 있도록 해주는 기능입니다. 기존의 INSERT ON CONFLICT나 UPSERT 방식보다 더 세밀한 제어가 가능합니다.
PostgreSQL은 15버전부터 MERGE 문을 공식적으로 지원하기 시작했습니다.
2. MERGE 문 기본 구조
TYPE1 -- 기본 MERGE
MERGE INTO 대상_테이블 AS a
USING 소스_테이블 AS b
ON (a.기준_컬럼 = b.기준_컬럼)
WHEN MATCHED THEN
UPDATE SET a.컬럼1 = b.컬럼1
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2) VALUES (b.컬럼1, b.컬럼2);
TYPE2 -- 특정 데이터 관련 MERGE
MERGE INTO 대상_테이블 AS a
USING (
SELECT 컬럼1, 컬럼2
FROM 소스_테이블
WHERE 조건
) AS b
ON a.컬럼1 = b.컬럼1
AND a.컬럼2 = b.컬럼2
WHEN MATCHED THEN
UPDATE SET a.컬럼1 = b.컬럼1
WHEN NOT MATCHED THEN
INSERT (컬럼1, 컬럼2) VALUES (b.컬럼1, b.컬럼2);
- ON 절: 대상 테이블과 소스 테이블을 매칭하는 조건
- WHEN MATCHED: 조건이 일치하는 경우 수행할 작업 (예: 업데이트)
- WHEN NOT MATCHED: 조건이 일치하지 않는 경우 수행할 작업 (예: 삽입)
3. MERGE 문 예제
3.1 테이블 생성
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name TEXT,
email TEXT UNIQUE,
age INT
);
CREATE TABLE new_customers (
id SERIAL PRIMARY KEY,
name TEXT,
email TEXT UNIQUE,
age INT
);
3.2 MERGE 문 사용 예시
MERGE INTO customers AS c
USING new_customers AS nc
ON (c.email = nc.email)
WHEN MATCHED THEN
UPDATE SET name = nc.name, age = nc.age
WHEN NOT MATCHED THEN
INSERT (name, email, age) VALUES (nc.name, nc.email, nc.age);
3.3 예제 데이터
INSERT INTO new_customers (name, email, age) VALUES
('Alice', 'alice@example.com', 30),
('Bob', 'bob@example.com', 25);
위 SQL을 실행하면 new_customers 테이블의 데이터가 customers 테이블에 병합됩니다.
- email이 기존에 존재하면 name과 age를 업데이트
- 존재하지 않으면 새로운 행을 삽입
4. MERGE 문을 사용할 때 주의할 점
- 성능 고려: 대량의 데이터를 처리할 경우 인덱스를 잘 활용해야 성능 저하를 방지할 수 있습니다.
- 충돌 방지: UNIQUE 제약 조건을 위반할 가능성이 있는 데이터가 있다면 미리 확인하는 것이 좋습니다.
- 버전 확인: PostgreSQL 15 이상에서만 MERGE 문을 지원합니다.
5. 결론
MERGE 문을 사용하면 여러 개의 INSERT, UPDATE 문을 하나로 합쳐서 보다 깔끔하고 효율적인 데이터 처리를 할 수 있습니다. PostgreSQL 15 이상을 사용한다면 MERGE 문을 적극 활용해보세요
반응형
'DB > postgreSQL' 카테고리의 다른 글
postgreSQL UPDATE, DELETE 조인 사용법 (0) | 2025.04.01 |
---|---|
postgreSQL 임시테이블 생성 (0) | 2025.03.28 |