IT 성장일기

[MySQL] MySQL, MariaDB에서 Merge 구문 구현하기 본문

Database/MySQL(Maria DB)

[MySQL] MySQL, MariaDB에서 Merge 구문 구현하기

고 양 2024. 12. 24. 01:38
반응형
MySQL, MariaDB에서 Merge 구문 구현하기

Merge가 머지?

키를 비교해서 행이 이미 존재한다면 UPDATE를, 존재하지 않으면 INSERT를 수행하는 구문을 의미합니다.

Oracle이나 SQL Server에는 Merge 구문이 존재하지만 MySQL에서는 조금 다른 방법으로 같은 동작을 수행할 수 있습니다.

INSERT ~ ON DUPLICATE KEY UPDATE

대상 테이블의 기본 키 또는 고유 키를 기반으로 INSERT 또는 UPDATE를 수행합니다.

가장 널리 알려져 있으며 단순하고 쉽게 구현할 수 있습니다.

INSERT INTO tavle
    (col_id, col01, col02, col03, reg_date)
VALUES
    ('A0001', 'val01', 'val02', 'val03'. NOW())
ON DUPLICATE KEY UPDATE
    col01 = VALUES(col01),
    col02 = VALUES(col02),
    col03 = VALUES(col03),
    reg_date = NOW();

CTE를 사용한 INSERT ~ ON DUPLICATE

복잡한 조건이 포함될 경우 WITH절과 함께 사용할 수 있습니다.

MariaDB 10.3 이상에서 사용 가능합니다.

WITH Upsert AS (
    SELECT 
        'A0001' AS col_id,
        CASE 
            WHEN() THEN 'val01'
            WHEN() THEN 'val001'
            ELSE 'val0001' END AS col01,
        'val02' AS col02,
        ...
        NOW()
)
INSERT INTO tavle
    (col_id, col01, col02, col03, reg_date)
SELECT ^ FROM Upsert
ON DUPLICATE KEY UPDATE
    col01 = VALUES(col01),
    col02 = VALUES(col02),
    col03 = VALUES(col03),
    reg_date = NOW();

REPLACE INTO

대상 테이블의 기본 키 또는 고유 키를 비교하여 기존 데이터를 삭제한 후 새로운 데이터로 교체합니다.

INSERT ~ ON DUPLICATE 구문에 비해 간결하게 사용할 수 있고 중복 처리에 있어 편리하지만,

트리거나 외래 키 참조 조건이 있는 경우 주의하시길 바랍니다.

REPLACE INTO tavle
    (col_id, col01, col02, col03, reg_date)
VALUES
    ('A0001', 'val01', 'val02', 'val03'. NOW())

INSERT + UPDATE 조합

기존의 데이터를 직접 확인한 후 UPDATE 또는 INSERT를 수행하는 방법입니다.

복잡한 조건문을 포함할 수 있으며 매우 유연하게 데이터를 비교할 수 있습니다.

UPDATE tavle
SET 
      col_id = 'A0001'
    , col01 = 'val01'
    , col02 = 'val02'
    , col03 = 'val03'
    , reg_dt = NOW()
WHERE some_condition 

INSERT INTO tavle
    (col_id, col01, col02, col03, reg_date)
SELECT 
      'A0001'
    , 'val01'
    , 'val02'
    , 'val03'
    , NOW()
WHERE NOT EXISTS (
    SELECT 1 
    FROM tavle 
    WHERE some_condition 
);

장단점 비교

지금까지 알아본 구문들은 아래와 같은 여러 가지 장단점이 존재하고 상황에 따라 권장되는 경우가 나뉩니다.

 

1. INSERT ~ ON DUPLICATE KEY UPDATE

장점:

  • 구문의 간결함
  • 인덱스 활용과 충돌 확인에 의한 빠른 성능

단점:

  • 복잡한 로직 제한
  • 조건적 업데이트 제한

권장되는 상황:

  • 단순한 업데이트 작업
  • 고유 식별자가 존재하는 경우

 

2. CTE를 사용한 INSERT ~ ON DUPLICATE KEY UPDATE

장점:

  • 복잡한 로직 처리가 가능함
  • 쿼리의 구조화

단점:

  • 비교적 성능에 제약이 있음
  • 복잡성이 증가함

 

3. REPLACE INTO

장점:

  • 구문이 가장 단순함
  • 데이터 무결성 확보에 용이함

단점

  • 트리거 또는 외래키 제약조건이 있는 경우 주의가 필요함

 

4. INSERT + UPDATE의 조합

장점: 

  • 복잡하고 유연한 조건 처리가 가능함
  • INSERT와 UPDATE문의 구분으로 각각 다른 조건을 추가할 수 있음.

단점

  • 트랜잭션 관리가 요구됨

감사합니다.

반응형