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
'Engineering > DB' 카테고리의 다른 글
update 특정 필드 내 문자열 변경 on MySQL (0) | 2023.12.04 |
---|---|
[MSSQL] 특정 테이블에서 날짜 필드로 삭제하는 StoreProcedure (0) | 2020.10.05 |
SQL LEFT JOIN 간단 예제 (0) | 2018.04.20 |
CentOS 7 에서 MySQL 5.6 설치 (0) | 2016.02.22 |
mysql sql 파일을 database 에 insert (0) | 2015.11.11 |