Mysql DB를 사용하면서 스케줄러를 통해 특정 테이블에서 데이터를 긁어와 insert를 해주는 로직을 작성하였다.
문제는 insert 해주었던 바라보는 기존 테이블이 수정이 일어나면 수정날짜부분을 확인하여 똑같이 수정을 해줘야 하는데, 그때마다 PK값을 가져와서 전부 DELETE하고 다시 INSERT하고 이렇게 자바단에서 처리를 해야하나 골치아픈 상황을 경험하였는데 검색을 통해 INSERT를하면서 PK값이 존재하면 UPDATE를 해주는 ON DUPLICATE KEY UPDATE를 찾았다.
해당 방식은 INSERT를 하다가 PK값이 존재하면 UPDATE를 한다는 조건이 있는데 이 조건을 만족하기 위해 테이블에 무조건 PK값이 지정이 되어있어야 정상적으로 동작한다.
Mysql 쿼리 사용법
INSERT INTO TABLENAME
(
PKColumn,
Column1,
Column2,
Column3,
Column4,
Column5,
...
)
VALUES
(
pkData,
Data1,
Data2,
Data3,
Data4,
Data5,
...
)
ON DUPLICATE KEY UPDATE
Column1 = Data1,
Column2 = Dat2,
Column3 = Data3,
Column5 = Data5
특정 테이블에 Insert하는부분은 동일하다
values 처리하는부분이 끝나고 ON DUPLICATE KEY UPDATE
처리후 넣고자 하는 컬럼에 데이터값을 입력해주면 된다.
해당 예시 쿼리는 Column1~5까지 insert를 하지만 pk값이 겹칠경우 column4는 제외하고 업데이트가 일어난다.
Mybatis에서 forEach내 사용법
INSERT INTO TABLENAME
(
PKColumn,
Column1,
Column2,
Column3,
Column4,
Column5,
...
)
VALUES
<if test="list != null and list.size > 0">
<foreach collection="list" item="item" index="index" separator=" , ">
(
#{item.pkData},
#{item.Data1},
#{item.Data2},
#{item.Data3},
#{item.Data4},
#{item.Data5},
...
)
</foreach>
ON DUPLICATE KEY UPDATE
Column1 = values(Column1),
Column2 = values(Column2),
Column3 = values(Column3),
Column5 = values(Column5)
</if>
mybatis에서 insert처리시 여러개를 처리할때 파라미터로 LIST 데이터를 담아서 넘기고 해당 값을 쪼개서 동시에 처리하는 경우가 있는데 이때도 동일하게 사용할 수 있다.
UPDATE구문에선 values(컬럼명)으로 변경해줘야 정상적으로 UPDATE가 동작한다.
'Databases > Mysql' 카테고리의 다른 글
Mysql - date_format 사용하기 포맷형태(%Y-%m-%d) (0) | 2020.02.06 |
---|---|
Mysql - join문을 활용한 update처리 (0) | 2020.01.22 |
Mysql - 접근중인 세션, 접속자 확인하기 (0) | 2020.01.15 |
Mysql - Could not get JDBC Connection; nested exception is java.sql.SQLException(톰캣 mysql 연결 에러, 용량문제) (0) | 2019.12.16 |
Mysql - 테이블 명세서 쿼리를 통해 호출하기 (0) | 2019.12.06 |