👀 SQL MERGE문이란?
조건에 따라서 INSERT를 하거나 UPDATE, DELETE를 하는 SQL 구문입니다.
MERGE문을 사용하면 변경할 테이블에 데이터가 존재하는지 체크하고, UPDATE, DELETE, INSERT를 한 번에 작업이 가능합니다.
오라클 DB를 사용하며 테이블에 데이터를 삽입할 때 이미 해당 데이터가 존재하면 값을 UPDATE하는 로직이 필요했는데 MERGE 구문을 알게 되어 쿼리 하나만을 사용해 해결할 수 있었습니다.!
👀 MERGE문의 기본적인 형식은 다음과 같습니다.
MERGE INTO [UPDATE되거나 INSERT 될 테이블]
USING [MERGE를 진행하고 싶은 대상, 조인, 서브쿼리도 사용 가능]
ON [조건]
WHEN MATCHED THEN [조건에 맞는 데이터가 있을 시 실행할 구문, UPDATE, DELETE]
WHEN NOT MATCHED THEN [조건에 맞는 데이터가 없을 시 실행할 구문, INSERT]
[단일 테이블 MERGE 사용법]
MERGE
INTO students a
USING dual
ON (a.no = 3)
WHEN MATCHED THEN
UPDATE
SET a.grade = 100
WHEN NOT MATCHED THEN
INSERT (a.no, a.grade)
VALUES (3, 100);
단일 테이블에서 사용시 USING에 dual을 넣습니다.
student 테이블에서 컬럼 no = 3인 행을 찾아 있으면 UPDATE, 없으면 INSERT를 하는 예시입니다.
[조인 사용법]
MERGE
INTO students a
USING classes b
ON (a.no = 3 AND a.classno = b.classno)
WHEN MATCHED THEN
UPDATE
SET a.classtime = b.classtime
WHEN NOT MATCHED THEN
INSERT (a.no, a.classno, a.classtime)
VALUES (3, b.classno, b.classtime);
students 테이블과 classes 테이블을 조인하고 조건에 맞는 데이터를 비교하여 구문을 실행합니다.
👀 MySQL에서 MERGE문 따라하기
MySQL에는 MERGE 구문이 따로 없어 비슷한 동작을 하는 다른 방식으로 사용해야 합니다.
INSERT INTO students(
no,
classno,
classtime,
grade
)VALUES(
3,
7,
'14:00',
90
)
ON DUPLICATE KEY UPDATE
classtime = '14:00',
grade = 90,
MySQL에서는 INSERT를 해보고 Primary Key값이 중복되면 UPDATE를 하는 방식으로 사용합니다.
PK값으로 중복체크를 하기 때문에 INSERT시 PK값도 반드시 넣어줘야 합니다.