DB/postgreSQL

postgreSQL merge문 사용하기

devmean 2025. 3. 28. 16:00

1. MERGE 문이란?

MERGE 문은 데이터베이스에서 데이터를 삽입(INSERT), 업데이트(UPDATE), 삭제(DELETE)를 한 번의 SQL 문으로 수행할 수 있도록 해주는 기능입니다. 기존의 INSERT ON CONFLICTUPSERT 방식보다 더 세밀한 제어가 가능합니다.

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이 기존에 존재하면 nameage를 업데이트
  • 존재하지 않으면 새로운 행을 삽입

4. MERGE 문을 사용할 때 주의할 점

  1. 성능 고려: 대량의 데이터를 처리할 경우 인덱스를 잘 활용해야 성능 저하를 방지할 수 있습니다.
  2. 충돌 방지: UNIQUE 제약 조건을 위반할 가능성이 있는 데이터가 있다면 미리 확인하는 것이 좋습니다.
  3. 버전 확인: PostgreSQL 15 이상에서만 MERGE 문을 지원합니다.

5. 결론

MERGE 문을 사용하면 여러 개의 INSERT, UPDATE 문을 하나로 합쳐서 보다 깔끔하고 효율적인 데이터 처리를 할 수 있습니다. PostgreSQL 15 이상을 사용한다면 MERGE 문을 적극 활용해보세요

반응형

'DB > postgreSQL' 카테고리의 다른 글

postgreSQL UPDATE, DELETE 조인 사용법  (0) 2025.04.01
postgreSQL 임시테이블 생성  (0) 2025.03.28