반응형
MSSQL에서 데이터를 넣을 때,
이미 있으면 UPDATE, 없으면 INSERT 하고 싶을 때가 많습니다.
이럴 때 유용한 기능이 바로 MERGE
문입니다. ✅
이번 포스팅에서는 MERGE
문을 활용해서 UPSERT (Insert + Update) 처리하는 방법을 정리해볼게요.
🎯 MERGE 문이란?
MERGE
문은 소스(Source) 테이블과 대상(Target) 테이블을 비교해서 다음 3가지 작업을 자동으로 처리해주는 문법입니다:
- 대상에 없으면 INSERT
- 대상에 이미 있으면 UPDATE
- 필요하면 조건에 따라 DELETE도 가능
📌 즉, 조건에 따라 INSERT / UPDATE / DELETE를 한 번에 처리할 수 있는 강력한 SQL 구문입니다.
🧪 MERGE 기본 구조
MERGE INTO TargetTable AS T
USING SourceTable AS S
ON T.key = S.key
WHEN MATCHED THEN
UPDATE SET T.col1 = S.col1, T.col2 = S.col2
WHEN NOT MATCHED THEN
INSERT (col1, col2, col3)
VALUES (S.col1, S.col2, S.col3);
MATCHED
:ON
조건이 맞는 경우 → UPDATENOT MATCHED
:ON
조건이 안 맞는 경우 → INSERT
🛠 실전 예제: 고객 테이블 UPSERT
1. 대상 테이블 (Customers
)
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
Name VARCHAR(100),
Email VARCHAR(100)
);
2. 소스 테이블 (신규 데이터)
CREATE TABLE NewCustomers (
CustomerID INT,
Name VARCHAR(100),
Email VARCHAR(100)
);
3. MERGE 실행
MERGE INTO Customers AS T
USING NewCustomers AS S
ON T.CustomerID = S.CustomerID
WHEN MATCHED THEN
UPDATE SET
T.Name = S.Name,
T.Email = S.Email
WHEN NOT MATCHED THEN
INSERT (CustomerID, Name, Email)
VALUES (S.CustomerID, S.Name, S.Email);
✅ 이렇게 하면 기존 고객은 정보가 갱신(Update) 되고,
신규 고객은 추가(Insert) 됩니다.
🔐 주의할 점
MERGE
는 대상 테이블에 Primary Key 또는 UNIQUE 제약 조건이 있어야 정확히 동작합니다.WHEN MATCHED
가 중복 조건을 만나면 에러가 날 수 있으므로ON
조건을 유일하게 설정해야 합니다.- 트리거가 있는 테이블에서 MERGE는 예상치 못한 동작을 할 수 있으니 주의!
💡 MERGE 문 + DELETE 예제
MERGE INTO Customers AS T
USING NewCustomers AS S
ON T.CustomerID = S.CustomerID
WHEN MATCHED AND S.Name IS NULL THEN
DELETE
WHEN MATCHED THEN
UPDATE SET T.Name = S.Name, T.Email = S.Email
WHEN NOT MATCHED THEN
INSERT (CustomerID, Name, Email)
VALUES (S.CustomerID, S.Name, S.Email);
✅ 조건에 따라 삭제도 함께 처리할 수 있어요!
🧾 요약
상황 | 처리 방식 | 문법 |
---|---|---|
데이터가 있음 | UPDATE | WHEN MATCHED |
데이터가 없음 | INSERT | WHEN NOT MATCHED |
조건 충족 시 삭제 | DELETE | WHEN MATCHED AND 조건 THEN DELETE |
🎯 마무리
MERGE
문은 MSSQL에서 데이터 동기화, 변경 추적, UPSERT 처리에 정말 유용한 기능입니다.
복잡한 IF EXISTS ... THEN UPDATE ELSE INSERT
구문보다 훨씬 간결하고 효율적이에요.
🔥 실무 자동화 쿼리에 적극 활용해보세요!
반응형
'Programming' 카테고리의 다른 글
🔐MSSQL에서 테이블 잠금(Lock)과 Deadlock 처리법 총정리 (0) | 2025.03.23 |
---|---|
🔁 Python으로 MSSQL 반복 쿼리 실행 및 자동화 방법 (0) | 2025.03.22 |
🚀 MSSQL에서 레코드 가져오기 (TOP, OFFSET, LEAD 등) 완벽 정리 (0) | 2025.03.21 |
🚀 MSSQL에서 중복 데이터 처리(중복 제거 및 찾기) 완벽 가이드 (0) | 2025.03.20 |
🚀 MSSQL에서 날짜 연산 쉽게 하기! (`DATEADD`, `DATEDIFF`, `GETDATE` 활용) (0) | 2025.03.19 |