[TIL / 데이터 관리] MySQL TIMESTAMP vs DATETIME

알락·2022년 10월 19일
1

데이터베이스

목록 보기
2/4
post-custom-banner

Data Logo

두 타입의 공통 역할

한참 MySQL의 데이터 타입을 정리해 나가고 있는데, 비슷한 값을 저장하는 TIMESTAMPDATETIME을 왜 따로 설정해서 사용하는지 궁금해졌다.
TIMESTAMPDATETIME은 둘 다 기본 형식이 YYYY-MM-DD HH:MM:SS이다. 이외에 형식을 지키지 않는 입력이 들어오면 0을 저장한다. 그래서 깊게 생각하지 않고 날짜와 시간을 저장하기 위해서 사용하는 거면 둘 다 사용해도 무방해 보인다.


나를 혼란스럽게 했던 설명

TIMESTAMP는 날짜와 시간을 나타내는 타임스탬프를 저장할 수 있는 타입입니다.
TIMESTAMP 타입의 필드는 사용자가 별다른 입력을 주지 않으면, 데이터가 마지막으로 입력되거나 변경된 시간이 저장됩니다.
따라서 데이터의 최종 변경 시각을 저장하고 확인하는 데 유용하게 사용됩니다.

-- TCP SCHOOL 설명

이 설명만 보고 나는 TIMESTAMP는 따로 다른 설정을 안해줘도 데이터가 입력이 되거나 수정될 때마다 현재 시간을 저장하게 만드는 타입으로 생각하고 사용하였다.
NULL

하지만 테이블 생성 후에, 테이블 컬럼에 대한 정보들을 확인해보면 TIMESTAMP로 타입이 지정된 DATE 칼럼에 기본값과 따로 어떤 설정도 안 되어 있는 것을 확인할 수 있다.
RESULT

당연하게도 새로운 레코드를 추가하였을 때 DATE는 아무 값도 들어있지 않다. 따라서 내가 알고 있던 TIMESTAMP의 기본적인 기능조차도 작동이 안 된다는 것을 확인했다.


TIMESTAMP의 기능을 어떻게 구현할 수 있을까?

새로운 레코드를 저장할 때 자동 현재 시간 저장

MODIFY

결국 내가 직접 컬럼의 Default 값을 NOW()로 설정해주었다. 이제는 새로운 레코드가 저장될 때마다 따로 DATE 컬럼의 값을 지정해주지 않아도 현재 시각으로 저장을 하게 된다.

UPDATE가 있을 때 자동 현재 시간 저장

이제 기존의 레코드를 수정할 때 따로 INSERT INTO에 기입하지 않아도 자동으로 수정된 날짜를 자동으로 바뀌게 만들려고 한다.

mysql > ALTER TABLE VISIT ADD COLUMN UPDATE_DATE TIMESTAMP DEFAULT NOW() ON UPDATE NOW();

mysql > INSERT INTO VISIT (CUSTOMER_ID) VALUE(2);

mysql > UPDATE VISIT SET CUSTOMER_ID = 3 WHERE ID = 5;

위의 MySQL 구문은 ON UPDATE가 핵심이다. 직관적으로 의미를 알 수 있듯이, 업데이트 될 때 어떤 값으로 대체할지에 대한 선언문이라 생각하면 되겠다.
이후 새로운 레코드를 추가해줬고, 업데이트 될 때 시간이 의도했던 데로 갱신되는지 확인해봤다.
complete

이제서야 내가 알고있던 TIMESTAMP의 기능이 구현되었다.


DATETIME 에서도 똑같은 방식으로 구현이 가능한가?

결론적으로 똑같은 명령어를 사용하여 기능을 구현시키면 똑같이 작동한다.
그래서 자동 생성, 자동 갱신으로 DATETIMETIMESTAMP를 구분하여 사용할 수 없다.


진정한 차이

TIMESTAMP는 UNIX timestamp 를 사용한다. 그래서 "1970-01-01 00:00:01 UTC" 부터 "2038-01-19 03:14:07 UTC" 에서만 사용할 수 있다.
DATETIMEMySQL에 종속되어 있는 시간 타입을 사용한다. "9999-12-31 23:59:59"의 범위까지 사용할 수 있다.

대신 TIMESTAMP의 경우는 시간 계산이 용이하다는 장점이 있다. 특히 세계적으로 국가마다 다른 표준시간을 정해놓고 사용하는데, TIMESTAMP는 해당 국가의 표준시간에 맞춰 저장을 하게 도와준다. 여러 지역에서 서비스되는 프로그램이면 TIMESTAMP를 사용하는게 나을 수 있다.

참고

profile
블록체인 개발 공부 중입니다, 프로그래밍 공부합시다!
post-custom-banner

0개의 댓글