Engineering/DB

[mysql] INSERT ... ON DUPLICATE KEY UPDATE

산책散策 2024. 12. 11. 15:13
728x90

 MySQL 쿼리 구문중에 "INSERT ... ON DUPLICATE KEY UPDATE" 로 insert or update 를 자주 사용하는데, 그동안 잘못 이해하고 있었던 내용(on update datetime 필드)이 있어서 공유하고자 한다.

 

 간단하게 num 이라는 key 컬럼과 테이블 데이터 변경될때마다 현재 시간을 저장하기 위한 mod_time 이라는 시간 필드가 있다.

create table t (
  num INT not null,
  val VARCHAR(10),
  unique key (num),
  mod_time datetime default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
);

 

빈 테이블일때, (1, 'value1') 이라는 데이터를 추가하면 mod_time 필드가 현재 시간으로 나온다.

다시 쿼리문을 실행하면 1 이라는 키가 존재하기 때문에, val 필드는 'value2' 로 바뀌고 mod_time 필드도 업데이트 되었다.

 

그런데, 시간이 조금 지나고 나서 동일한 키에 val 필드도 동일한 값('value2') 로 해서 쿼리문을 실행하면 mod_time 필드는 변경이 안된다.

 

 같은 키라서 on update 가 실행되었을거라 생각하고 mod_time 필드에 "on update CURRENT_TIMESTAMP" 가 붙여있으니 당연히 mod_time 시간값이 바뀔거라 생각했지만, 결과는 예상과 달랐다.

 

 MySQL 설명을 찾아보니, "INSERT ... ON DUPLICATE KEY UPDATE"  구문에서 현재값이랑 동일한 값이랑 설정되면 쿼리문 실행 결과값은 0 이 된다고 한다. 

( on duplicate key 인데도 결과가 1 이 나온다면 "CLIENT_FOUND_ROW" 옵션이 켜져있는 것이다. 이 옵션은 동일한 값이 발견이 되었다는 표시라고 한다. https://dev.mysql.com/doc/refman/8.4/en/information-functions.html )

 

결론

 메뉴얼을 잘 읽고 기능을 잘 확인하자.

 

참고

https://dev.mysql.com/doc/refman/8.4/en/insert-on-duplicate.html

 

MySQL :: MySQL 8.4 Reference Manual :: 15.2.7.2 INSERT ... ON DUPLICATE KEY UPDATE Statement

15.2.7.2 INSERT ... ON DUPLICATE KEY UPDATE Statement If you specify an ON DUPLICATE KEY UPDATE clause and a row to be inserted would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row occurs. For example, if column a is de

dev.mysql.com