본문 바로가기
DBMS/MySQL

[MySql] 값이 있으면 INSERT, 없으면 UPDATE / PK 중복시 업데이트 구문 / ON DUPLICATE KEY UPDATE

by 성은2 2022. 7. 5.

서칭중 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

 

 

 

 

https://blog.lael.be/post/370

 

MySQL 쓰면서 하지 말아야 할 것 17가지

*MySQL 쓰면서 하지 말아야 할 것 17가지* 권장사항이다. 이것을 이해하면 당신의 어플리케이션이 더 나은 성능을 발휘할 것이다. 다만 이것이 사람의 실력을 판단하는 척도로 사용되서는 안 될 것

blog.lael.be