서칭중 MySql 속도를 위한 메모를 봤는데
ON DUPLICATE KEY UPDATE 사용을 권장한다.
: 데이터 삽입 시, PK나 UNIQUE KEY가 중복인 경우 UPDATE 하는 구문(중복이 아니면 INSERT)
Oracle의 MERGE INTO와 유사하게 DB에 해당row 가 없으면 INSERT, 있으면 UPDATE 와 같이 역할을 나눌 수 있다.
SELECT 구문을 이용해서 코드가 있으면 업데이트 하고 없으면 인서트 하는 코드ㄴㄴ
- 서버에 불필요하게 왔다갔다 하지 않아도 된다.
구문
<insert id="addMember"> INSERT INTO member (name, age, cnt) VALUES ('kim', 26, 0) ON DUPLICATE KEY UPDATE age = age -1, cnt = cnt + 1; </insert> |
ON DUPLICATE KEY UPDATE 이후에는 변경할 컬럼 값만 적어준다. 전부 적지 않아도 된다.
예제
<insert id="inquiryInsertOrUpdate" useGeneratedKeys="true" keyProperty="answerId">
INSERT INTO inquiry_answer
( inquiry_id
, answer_contents
, created_date
, answer_writer)
VALUES
( #{inquiryId}
, #{answerContents}
, NOW()
, #{userId}
) ON DUPLICATE KEY
UPDATE inquiry_id = #{inquiryId}
, answer_contents = #{answerContents}
, created_date = NOW()
, answer_writer = #{userId}
</insert>
- 사용시 주의
- ON DUPLICATE KEY UPDATE 문을 사용하기 위해서는 무조건 PK 가 있어야 한다
- DB에서 PK를 정확히 설정해줘야 하고 UK도 정확히 설정해줘야 적용된다.
- 정확히의 기준은, 어떤 값이 중복되었을때를 기준으로 insert / update로 나눌지를 파악하라는 것이다.
- 둘 이상의 PK 또는 UK가 있는 테이블에 대한 명령문도 안전하지 않은 것으로 표시됩니다.
(버그 #11765650, 버그 #58637)
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
MySQL 쓰면서 하지 말아야 할 것 17가지
*MySQL 쓰면서 하지 말아야 할 것 17가지* 권장사항이다. 이것을 이해하면 당신의 어플리케이션이 더 나은 성능을 발휘할 것이다. 다만 이것이 사람의 실력을 판단하는 척도로 사용되서는 안 될 것
blog.lael.be
'DBMS > MySQL' 카테고리의 다른 글
[MySQL] rownum, 역순 출력 (0) | 2022.08.22 |
---|---|
[MySql] SELECT 결과 UPDATE / NULL인 경우 mybatis에서 0 혹은 특정 값 UPDATE 시키기 (0) | 2022.08.11 |