[MySql][MyBatis] upsert 쿼리

하파타카·2023년 9월 19일
0

SQL

목록 보기
24/26

upsert

쿼리를 보낼때 DB의 uniq컬럼의 값을 받아왔을 경우 update문을, 못받아왔을 경우 insert문을 보내는 쿼리.
DB마다 사용법이 조금씩 다른듯함.
이 포스트에서는 Mysql의 방법을 다룸. (mariaDB도 동일하게 적용된다.)

기본형

INSERT INTO 테이블명 (insert할 컬럼1, insert할 컬럼2, insert할 컬럼3, insert할 컬럼4)
VALUES (insert할 값1, insert할 값2, insert할 값3, insert할 값4)
ON DUPLICATE KEY
UPDATE
	update할 컬럼1 = update할 값1 ,
    update할 컬럼2 = update할 값2 ,
    update할 컬럼3 = update할 값3 ,
    update할 컬럼4 = update할 값4
;

주의점

여기서 주의할점은 상단의 insert구문과 하단의 update구문중 하나만 돌아가는 구조라서 insert할 컬럼과 값을 모두 넣어주어야 한다는 점이다.
내 경우 모든 컬럼을 insert해야하는데 insert구문에 pk나 uniq컬럼 및 값만 넣으면 되는줄 알고 다른 값은 빼고 넣었더니 pk, uniq컬럼을 제외한 모든 컬럼에 DB기본값(null, 0 등)이 들어가버렸다.

예제

예제 1

아래는 mybatis를 이용해 user테이블에 upsert쿼리를 적용하는 예시.
이때 id값은 pk임.

  INSERT INTO user (
      id,
      name,
      phone,
      birthDate
  ) VALUES (
      id값,
      name값,
      phone값,
      birthDate값
  )
  ON DUPLICATE KEY
  UPDATE
      NAME = name값,
      phone = phone값,
      birthDate = birthDate값

예제 2

user의 id값(pk)이 있으면 name, phone, birthDate값을 update,
id값이 없으면 name값만 insert(id는 AutoIncrement) 해주는 쿼리의 경우 아래처럼 사용하면 된다.

  INSERT INTO user (
      id,
      name
  ) VALUES (
      id값 ,
      name값
  )
  ON DUPLICATE KEY
  UPDATE
      NAME = name값,
      phone = phone값,
      birthDate = birthDate값

MyBatis에서의 upsert

<insert id="save" parameterType="User">
  INSERT INTO user (
      id,
      name,
  ) VALUES (
      #{id} ,
      #{name},
      #{phone},
      #{birthDate}
  )
  ON DUPLICATE KEY
  UPDATE
      NAME = #{name},
      phone = #{phone},
      birthDate = #{birthDate}
</insert>

mybatis에서는 insert쿼리로 취급하여 작성한다.


참고링크

추후에 추가

profile
천 리 길도 가나다라부터

0개의 댓글