IT 성장일기
[MySQL] MySQL, MariaDB에서 Merge 구문 구현하기 본문
반응형
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문의 구분으로 각각 다른 조건을 추가할 수 있음.
단점
- 트랜잭션 관리가 요구됨
감사합니다.
반응형
'Database > MySQL(Maria DB)' 카테고리의 다른 글
[MySQL] MySQL, Maria DB에서 컬럼 암, 복호화 하기 (0) | 2024.11.04 |
---|---|
[MySQL] MySQL, Maria DB에서 날짜를 구하는 다양한 방법 (0) | 2024.10.30 |
[MySQL] DATE_ADD와 DATE_SUB로 날짜 계산하기 (2) | 2024.10.21 |
[My SQL] My SQL 설치하기 (0) | 2023.09.11 |