2018. 3. 31. 00:31
반응형

spring framework에서 MySQL, MariaDB 등을 이용하여 웹개발을 할 때 종종 발생하는 경우이다.

예를 들어 어떤 사이트 정보를 수집하여 db에 저장할 때 새로운 항목에 대해서만 insert를 실행하고 기존에 있던 자료는 새로운 값으로 update 해줘야하는 경우가 있다.

이 때 기존에 값이 있는지 판단하기 위해 select count(*) 쿼리를 먼저 실행하여 있는지 없는지 판단하는 방법이 있다.


또 다른 방법으로는 on duplicate key update 를 이용하는 것이다.

이 경우 table에 기본키(primary key) unique한 칼럼이 있어야 할 것이다.


예제 테이블 (도시의 온도를 기록하는 table)

create table test(

no int auto_increment primary key,

city varchar(60) not null unique,

temp int not null

)

no가 pk이고 city의 경우 중복이 허용되지 않는다.


이때 insert 쿼리를 다음과 같이 하면된다.

mybatis mapper의 경우

insert into test (city, temp) values(#{city}, #{temp})

on duplicate key update temp = #{temp}


일반 쿼리

insert into test (city, temp) values('서울', 20)

on duplicate key update temp = 20;



위와 같은 쿼리를 계속 실행하면 테이블에 해당 도시가 있을 경우 온도만 업데이트 되고 해당 도시가 없을 경우 새로운 도시와 온도가 인서트된다.

pk인 no는 어차피 중복될 일이 없어보인다. auto_increment라서

반응형