API에서 파싱해온 정보를 주기적으로 DB에 적재시킬 예정이였기 때문에 동일한 강의라면 update를, 새로운 강의라면 insert를 해줄려고 했다.
pk를 조회해서 있으면 update, 없으면 insert 해주는 로직을 따로 짜도 되지만 oracle에서 merge의 편함을 알아버렸기 때문에 merge 구문을 사용할려고 하니까...?
mysql에서는 merge를 지원하지 않는다 ... 😨😱
Oracle Merge into 구문을 MySQL에서 지원하지는 않지만, 그와 비슷한(거의 똑같은?) 기능을 하는 문법이 있다.
바로 INSERT ON DUPLICATE KEY UPDATE 구문이다.
INSERT INTO tableNm(
column1
,column2
,column3
)VALUES(
'value1'
,'value2'
, now()
)
ON DUPLICATE KEY UPDATE
column2 = 'value3'
,column3 = now()
먼저 INSERT를 진행하고 해당 KEY값이 중복되면 Update를 한다.
여기서 주의해야 할 점은 INSERT 구문에 PK를 반드시 넣어야 한다!
위에 예시 쿼리에서 PK는 column1
이다. 그렇기 때문에 KEY값이 DUPLICATE 됐을 때
column2, column3이 UPDATE 되는 것이다.
TRAIN_CD
ACAD_CD
TRAIN_DEGR
3개가 PK 컬럼으로 설정되어있다.
INSERT 구문이 실행될때는 REG_DATE 컬럼에 날짜 정보가 들어가고,
UPDATE 구문이 실행될때는 UPDT_DATE 컬럼에 날짜 정보가 들어간다.
<update id="createAcademy" parameterType="hashMap">
INSERT INTO TB_ACAD(
TRAIN_CD,
TRAIN_TITLE,
ACAD_CD,
ACAD_TITLE,
URL,
ADDRESS,
TEL_NO,
TARGET,
YARD_MAN,
COURSE_MAN,
REAL_MAN,
TRAIN_DEGR,
START_DATE,
END_DATE,
REG_DATE
)VALUES(
#{trainCd},
#{trainTitle},
#{acadCd},
#{acadTitle},
#{url},
#{address},
#{telNo},
#{target},
#{yardMan},
#{courseMan},
#{realMan},
#{trainDegr},
#{startDate},
#{endDate},
SYSDATE()
)
ON DUPLICATE KEY UPDATE
TRAIN_TITLE = #{trainTitle},
ACAD_TITLE = #{acadTitle},
URL = #{url},
ADDRESS = #{address},
TEL_NO = #{telNo},
TARGET = #{target},
YARD_MAN = #{yardMan},
COURSE_MAN = #{courseMan},
REAL_MAN = #{realMan},
START_DATE = #{startDate},
END_DATE = #{endDate},
UPDT_DATE = SYSDATE()
</update>
처음 입사해서 받은 과제?를 수석님께서 코드리뷰 해주시면서
if(cnt>0){
update();
}else{
insert();
}
(대충 이런 식으로 짰던 코드였던거 같다..!)
위에 코드를 보시곤 'merge 구문 한번 적용해보세요 ~'라고 알려주셔서 알게되었는데,
java에서 코드도 한줄로 끝나고 너무 편해서 그 뒤로 자주 애용하고 있다. 🙆♀️