[Mybatis]ON DUPLICATE KEY UPDATE를 이용해 UPSERT 해보기(UPDATE + INSERT)

zzarbttoo·2021년 8월 4일
1

DB/Mybatis/JPA

목록 보기
1/7

회사 업무를 할 때 mybatis 를 이용해 쿼리를 다뤘었다
그 때 테이블을 주기적으로 update + insert 할 일이 있었다!

맨 처음에는 table을 전체 drop 하고 다시 데이터를 insert 하는 방법을 생각했으나 드롭한 사이에 호출을 할 수도 있는 상황인지라 다른 방법을 찾아야했다
🤦‍♀️

그러던 중 ON DUPLICATE KEY UPDATE를 이용해 UPSERT를 진행할 수 있다는 것을 알게 되었다!
그리고 update 할 컬럼을 지정할 수 있다는 점에서 효율적이었다!



<insert id = "updatedata">
	INSERT INTO 테이블이름(컬럼1, 컬럼2, 컬럼3, REGDATE) VALUES
	<foreach item = "item" separator = "," collection = "list">
	(#{item.column1}, #{item.column2}, #{item.column3}, NOW())
	</foreach>
	ON DUPLICATE KEY UPDATE 컬럼2 = values(컬럼2) , 컬럼3 = values(컬럼3), REGDATE = values(REGDATE) 
</insert>
  • insert/update 문이지만 insert 를 이용해야한다
  • INSERT INTO TABLE() 뒤의 괄호문에 무조건 컬럼명을 적어줘야한다
  • 위 쿼리는 mysql 기준이여서 NOW()를 사용했다
  • ON DUPLICATE KEY UPDATE 이후에는 변경할 컬럼 값만 적어준다 (컬럼2, 컬럼3, 컬럼4[REGDATE]에서 변경이 이루어진다)
  • 이 때 컬럼명 = values(컬럼명) 형식으로 사용한다
  • ON DUPLICATE KEY UPDATE 문을 사용하기 위해서는 무조건!!!!!!!!!!!!!!!!!!! Primary key 가 있어야 한다
  • 위 식에서는 컬럼1을 primary key 로 지정했다 가정했으며, 컬럼 1을 기준으로 없는 값은 insert가, 있는 값은 업데이트가 이루어지게 된다

비록 UPSERT 자체가 효율은 조큼 떨어진다만(9000건에 2초 정도 걸렸던 것 같다) 그래도 꼭 쓰여야 할 상황이 필요하니 적어놔야지

히히

profile
나는야 누워있는 개발머신

0개의 댓글