타임 스탬프 (자동)는 언제 업데이트됩니까?


79

나는 유형의 테이블의 열이있는 경우 TIMESTAMP기본적으로 가지고 : 나는의 가치 업데이트 할 경우 CURRENT_TIMESTAMP이 열은 현재 타임 스탬프로 업데이트됩니까 어떤 동일한 행 다른 열을?
그렇지 않은 것 같지만 이것이 일어날 일인지 확실하지 않습니다.
이것이 의미하는 바를 이해할 수 없습니다 ( MySQL 문서에서 ).

열이 자동 업데이트되는 경우 행에있는 다른 열의 값이 현재 값에서 변경 될 때 현재 타임 스탬프로 자동으로 업데이트됩니다. 다른 모든 열이 현재 값으로 설정된 경우 열은 변경되지 않은 상태로 유지됩니다. 다른 열이 변경 될 때 열이 업데이트되지 않도록하려면 명시 적으로 현재 값으로 설정하십시오. 다른 컬럼이 변경되지 않는 경우에도 컬럼을 업데이트하려면 반드시 있어야하는 값으로 명시 적으로 설정하십시오.] 2


2
test테이블 을 만들고 샘플 데이터를 업데이트 하여 이것을 시도하지 않은 이유는 무엇입니까? 그건 그렇고 업데이트에서 timestamp유형이 지정된 열을 업데이트 하지 않습니다 . 이것이 열 정의에 추가되지 않은 경우ON UPDATE CURRENT_TIMESTAMP
OldGaurd01 2016

답변:


138

명령을 내린다 SHOW CREATE TABLE whatever

그런 다음 테이블 정의를보십시오 .

아마 이런 줄이

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

그것에. 명시적인 타임 스탬프 설정이없는 DEFAULT CURRENT_TIMESTAMP모든 항목 INSERT은 현재 시간을 사용함을 의미합니다 . 마찬가지로, ON UPDATE CURRENT_TIMESTAMP명시적인 타임 스탬프가없는 업데이트는 현재 타임 스탬프 값으로 업데이트됨을 의미합니다.

테이블을 생성 할 때이 기본 동작을 제어 할 수 있습니다.

또는 타임 스탬프 열이 처음에 올바르게 생성되지 않은 경우 변경할 수 있습니다.

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;

이렇게하면 테이블에 대한 INSERT 및 UPDATE 작업이 자동으로 타임 스탬프 열을 업데이트합니다. whatevertable타임 스탬프를 변경하지 않고 업데이트하려는 경우 , 즉,

다른 열이 변경 될 때 열이 업데이트되지 않도록하려면

그런 다음 이러한 종류의 업데이트를 발행해야합니다.

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'

이것은 TIMESTAMPDATETIME열에서 작동합니다 . (MySQL 버전 5.6.5 이전에는 TIMESTAMPs 에서만 작동했습니다. ) s를 사용할 TIMESTAMP때 시간대가 고려됩니다. 올바르게 구성된 서버 시스템에서 해당 값은 항상 UTC로 저장되고 검색시 현지 시간으로 변환됩니다.


1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time. 내 경우에는 내가 가지고 DEFAULT CURRENT_TIMESTAMP 있지만UPDATE열이되어 있지 업데이트되었습니다. 내가 취소하고 있지 않다 그래서 당신은이 문장의 의미

내가 명확히하려는 내 편집을 참조하십시오. INSERT 및 UPDATE 기본 동작은 별도로 제어됩니다.
O. Jones

예, 타임 스탬프 열의 이름을 제공하는 INSERT 및 UPDATE 작업 모두 기본 current_timestamp 동작을 재정의합니다.
O. Jones

1
감사합니다. 내 문제의 완벽한 솔루션 일
Edwinfad

phpMyAdmin은 SQL 쿼리에 오류가 있다고 말합니다. "SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 'NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'근처에서 사용할 올바른 구문을 확인하십시오."
모즈 Kralj

14

이처럼 타임 스탬프 열을 정의해야한다고 생각합니다.

테이블 t1 생성 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

여기를 참조 하십시오


1
광산 만이DEFAULT CURRENT_TIMESTAMP

4

행에있는 다른 열의 값이 현재 값에서 변경되면 자동 업데이트 된 열이 현재 타임 스탬프로 자동으로 업데이트됩니다. 다른 모든 열이 현재 값으로 설정된 경우 자동 업데이트 된 열은 변경되지 않은 상태로 유지됩니다.

설명하기 위해 행이 하나만 있다고 가정 해 보겠습니다.

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

이제 다음 업데이트 열을 실행하면 :

 update my_table
 set price = 2

가격 값이 실제로 변경되지 않았기 때문에 updated_at 값은 변경되지 않습니다 (이미 2).

그러나 가격 값이 2가 아닌 다른 행이있는 경우 해당 행의 updated_at 값 (가격 <> 3)이 CURRENT_TIMESTAMP로 업데이트됩니다.


MySQL에 설명 된대로 동작을 확인했습니다. 또한 INSERT값이 변경 되지 않은 경우 로 계산되지 않으므로 동일한 상태로 유지 된 데이터를 포함하는 행의 ID 대신 (삽입이없는 경우) 와 같은 PHP 호출이 $this->pdo->lastInsertId()반환 0됩니다.
OXiGEN

@OXiGEN- UPDATE은 아니므로 열 변경 여부에 관계없이 값을 포함 할 INSERT것으로 예상 하지 않습니다.lastInsertIdlastInsertId일반적으로 자동 증가 ID 열이 INSERT있는 새 행 (어떤 ID가 할당되었는지 확인하기 위해) 에만 사용됩니다 . 기존 행을 변경할 때가 아닙니다.
ToolmakerSteve

3

데이터베이스에 트리거를 추가하십시오.

DELIMITER //
CREATE TRIGGER update_user_password 
  BEFORE UPDATE ON users
  FOR EACH ROW
    BEGIN
      IF OLD.password <> NEW.password THEN
        SET NEW.password_changed_on = NOW();
      END IF;
    END //
DELIMITER ;

비밀번호 변경 시간은 비밀번호 항목이 변경된 경우에만 업데이트됩니다.


2

UPDATE CURRENT_TIMESTAMP새로운 사람들에게는 이것이 혼란이기 때문에 찾을 위치를 추가 합니다.

대부분의 사람들은 phpmyadmin 또는 이와 유사한 것을 사용합니다.

선택한 기본값 CURRENT_TIMESTAMP

선택한 속성 (다른 드롭 다운) UPDATE CURRENT_TIMESTAMP

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.