쿼리를 보낼때 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 등)이 들어가버렸다.
아래는 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값
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값
<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쿼리로 취급하여 작성한다.
추후에 추가