TIP게시판

제목 mysql 자동으로 timestamp 등록 sql
글쓴이 한대승(불의회상) 작성시각 2012/05/31 16:49:12
댓글 : 7 추천 : 1 스크랩 : 0 조회수 : 50513   RSS
한대승(불의회상)
보통 날짜를 datetime 형식으로 사용 합니다.
mysql 에서는  timestamp 형식의 경우 자동으로 날짜를 집어 넣어 주는 기능이 있는데 사용 하려면 가물거려서 사용하지 않게 되죠.

아래 한 문장이면 간단하게 해결 됩니다.

자동으로 날짜를 집어넣을 수 있는 컬럼은 하나뿐 이라는거... 잊지마세요.
ALTER TABLE `테이블명` CHANGE `컬럼명` `컬럼명` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL; 
 다음글 세그멘트랑 쿼리스트링이랑 혼합해서 쓰기 (2)
 이전글 form validation 에서 한글 체크 규칙 (4)

댓글

땅그지.. / 2012/06/25 16:38:33 / 추천 0
 그냥 쿼리 쓸때 NOW() 이거로 하면 안될까요? 
자동으로 넣어 주는 방식(CURRENT_TIMESTAMP)으로 할 경우 데이터 업데이트가 되면 그때 자동으로 timestamp 값도 update 되는 생각지 못한 사태가 벌어 질 수 있거든요.

변종원(웅파) / 2012/06/25 17:25:38 / 추천 0
땅그지../ 위 팁은 timestamp 형식에 관한 내용입니다. 보통 datetime 형태로 많이 쓰는데 그때는 말씀하신 것처럼 now() 쓰시면 됩니다. 세계 어디서 접속해도 동일한 시간을 표시하게 하려면 timestamp 값을 써야합니다. 국내용 사이트 제작시에는 now() 만 써도 됩니다.
땅그지.. / 2012/07/03 12:40:33 / 추천 0
 웅파/ timestamp 형식에도 NOW() 가 먹힙니다. 물론 timestamp 형식으로 입력 되며 이것은 sysdate 값과는 무관하게 입력 됩니다.
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now
참조 입니다.
그리고 제가 우려한 것은 
ALTER TABLE `테이블명` CHANGE `칼럼명` `칼럼명` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
이렇게 칼럼을 수정하게 되면 update 시에 지정한 칼럼은 수정을 하지 않더라도 자동으로 수정한 타임을 기준으로 값이 변경 된다는 것입니다.
디비에 익숙하신 분들이야 다 아시는 내용이라 조심 하시겠지만 익숙하지 못하신 분들은 해 놓고 어디서 오류가 있는지 내가 잘못 입력한게 있는지 찾느라 시간 많이 잡아 먹을 수 있죠.(제가 초보때 저 설정 해 놓고 엄청 고생 한 경험이 좀 있어서요)
저 설정은 수정일에 대한 필드에만 적용 하도록 하고, 가입일,등록일 등 처음에 한번 입력 되면 바뀌면 안되는 곳에는 적용 하면 안되는 것입니다. 그냥 NOW() 이용하는게 속편합니다.
변종원(웅파) / 2012/07/05 13:49:08 / 추천 0
그래서 일반적인 상황에서는 NOW()를 쓰는게 좋다라고 글에 써놨습니다. 뭐가 문제일까요? ^^
땅그지.. / 2012/07/13 01:17:29 / 추천 0

뭐... 사용에 주의만 기울인다면 큰 문제는 없겠지만,
디비 초보 분들은 제가 그랬듯 "잘하시는 분이 추천 하신 방법이네 편리하겠구나" 하는 생각으로 저 설정을 사용 했다가 곤란한 상황에 빠지게 될 가능 성이 있을 것 같아 사족을 붙였었고요.
웅파님의 말씀에는 timestamp 라서 NOW() 함수가 안먹히기 때문에 저 설정을 사용 하였다 라고 오해 될 소지가 있어 보여서 답변을 달았던 것입니다.

.....
기왕에 하는 김에 좀만 더 첨언을 하겠습니다. (이 부분은 초보분들을 위해 적는 것이니 아시는 분은 패스해 주세요)
불의 화상님께서 알려 주신 필드 권한 수정 쿼리의 핵심은 'TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP' 이 부분일 것입니다.
이 쿼리를 분석 하자면 '기본 값으로 현재의 타임스템프 값을 넣고 업데이트 될때마다 타임스템프 값으로 갱신 하라.' 입니다.
즉 insert 쿼리시에 CURRENT_TIMESTAMP 값을 기본값으로 넣어 주고, update 시에 역시 CURRENT_TIMESTAMP 값으로 갱신 하게 되는 것이죠.  
그래서 ON UPDATE CURRENT_TIMESTAMP 와 DEFAULT CURRENT_TIMESTAMP 를 분리 해서 사용하는 것이 좋습니다.
자료가 수정 될때마다(update 쿼리가 실행 될때마다) 타임값을 바꿔 주어야 하는 경우에는 ON UPDATE CURRENT_TIMESTAMP 를 넣고 그렇지 않고 입력시에만(insert 쿼리가 실행 되었을 때만) 타임값을 넣어 주고 변경 되면 안되는 경우에는 DEFAULT CURRENT_TIMESTAMP 만 넣어 주는 것이 좋습니다.
 

쌈닭 / 2012/07/16 15:47:20 / 추천 0
 땅그지/ 저도 비슷한 경험을 ... ㅋㅋ
지지고 / 2012/10/02 10:57:08 / 추천 0
전 게을러 그런지 이상하게 쿼리명령어는 어렵네요.

뭣도 모를때 너무 복잡한 쿼리를 봐서 뇌가 쿼리문만 필터해서 입력받나봅니다. ㅎㅎ

수학도 그랬죠... 학교 졸업하고 몇 년후에 아무감정없이 보니 그 때 이해안되던게 이해가되고...

일단은 조금 이해가 되네요...

하나에 시간필드에 최초입력 & 계속 필드값 갱신필한 경우는 통합.
필드1 : 'TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP'

최초입력한 타임스탬프 보존하고 업데이트 필드는 또 다른 곳일 때는 구분.

필드1 : 최초시간필드 : ON UPDATE CURRENT_TIMESTAMP
필드2 : 업데이트용 필드 : DEFAULT CURRENT_TIMESTAMP