본문 바로가기
잡담

[ORACLE] MERGE SQL 사용해보기 (MySQL로 흉내)

by 쌩욱 2022. 4. 9.

👀 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값도 반드시 넣어줘야 합니다.