11.3.5 TIMESTAMP 및 DATETIME 자동 초기화 및 업데이트 기능
MySQL 5.6.5 이후에서는, TIMESTAMP
및 DATETIME
컬럼을 자동으로 초기화 현재 날짜 및 시간 (즉, 현재의 타임 스탬프)에 자동으로 업데이트 할 수 있습니다. 5.6.5 이전에는, 이것은 TIMESTAMP
밖에 맞지 않고 테이블 당 최대 하나의 TIMESTAMP
컬럼에만 적용되지 않습니다. 다음의주의 사항은 첫째, MySQL 5.6.5 이후에 자동 초기화 및 업데이트 기능에 대해 다음 5.6.5 이전 버전의 차이점에 대해 설명합니다.
테이블의 모든 TIMESTAMP
또는 DATETIME
컬럼에 기본값 또는 자동 업데이트 값, 혹은 그 양쪽으로 현재의 타임 스탬프를 할당 할 수 있습니다.
자동 초기화 된 컬럼은 컬럼에 값을 지정하지 않으면 삽입 행에 현재의 타임 스탬프로 설정됩니다.
자동 업데이트 된 컬럼은 행의 다른 컬럼의 값이 현재 값에서 변경되면 현재의 타임 스탬프가 자동으로 업데이트됩니다. 자동 업데이트 된 컬럼은 다른 모든 컬럼을 현재 값으로 설정되어 있으면, 변경되지 않은 채 유지됩니다. 다른 컬럼이 변경 될 때 자동 업데이트 컬럼이 업데이트되지 않도록하려면 명시 적으로이를 현재의 값으로 설정합니다. 다른 컬럼을 변경하지 않더라도 자동 업데이트 컬럼을 업데이트하려면 명시 적으로이를 원하는 값으로 설정합니다 (예를 들어
CURRENT_TIMESTAMP
로 설정합니다).
또한 NULL
속성을 사용하여 NULL
값을 허용하도록 정의되어 있지 않은 한, NULL
값을 할당하여 모든 TIMESTAMP
컬럼을 초기화하거나 현재 날짜와 시간에 업데이트 할 수 있습니다.
자동 등록 정보를 지정하려면 컬럼 정의에서 DEFAULT CURRENT_TIMESTAMP
및 ON UPDATE CURRENT_TIMESTAMP
절을 사용합니다. 절 순서는 관계 없습니다. 가 컬럼 정의에있는 경우 모두 먼저 실행할 수 있습니다. CURRENT_TIMESTAMP
동의어 모두 CURRENT_TIMESTAMP
와 같은 의미가 있습니다. 이들은 CURRENT_TIMESTAMP()
) NOW()
) LOCALTIME
, LOCALTIME()
) LOCALTIMESTAMP
및 LOCALTIMESTAMP()
입니다.
DEFAULT CURRENT_TIMESTAMP
및 ON UPDATE CURRENT_TIMESTAMP
의 사용은 TIMESTAMP
및 DATETIME
에만 적용됩니다. DEFAULT
절에도 DEFAULT 0
또는 DEFAULT '2000-01-01 00:00:00'
등의 일정 (비 자동)의 기본값을 지정하는 데 사용할 수 있습니다.
DEFAULT 0
을 사용한 다음 예제는 NO_ZERO_DATE
SQL 모드가 활성화 된 경우에는 작동하지 않습니다. 이 모드에서는 "제로"의 날짜 값 (예를 들어 0
'0000-00-00 00:00:00'
로 지정)이 거부되기 때문입니다. TRADITIONAL
SQL 모드에 NO_ZERO_DATE
가 포함되어 있습니다.
TIMESTAMP
또는 DATETIME
컬럼 정의는 현재 타임 스탬프를 기본값과 자동 업데이트 값 모두에 대해 지정하거나 둘 중 하나에 대해 지정할 수도 모두에 대해 지정하지 않을 수도 있습니다. 다른 컬럼은 자동 프로퍼티 별도의 조합을 가질 수 있습니다. 다음 규칙은 가능성이있는 경우에 대해 설명하고 있습니다.
DEFAULT CURRENT_TIMESTAMP
및ON UPDATE CURRENT_TIMESTAMP
를 모두 사용하면 열은 기본값이 현재의 타임 스탬프가 현재 타임 스탬프가 자동으로 업데이트됩니다.CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
DEFAULT
절을 사용하지만ON UPDATE CURRENT_TIMESTAMP
절을 사용하지 않으면 열은 소정의 기본값이 설정되어 현재의 타임 스탬프가 자동으로 업데이트되지 않습니다.기본값은
DEFAULT
절에서CURRENT_TIMESTAMP
를 지정하거나 상수 값을 지정 여부에 따라 다릅니다.CURRENT_TIMESTAMP
를 사용하는 경우, 디폴트는 현재 타임 스탬프입니다.CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP );
상수를 사용하는 경우, 디폴트는 소정의 값입니다. 이 경우, 컬럼은 자동 프로퍼티는 없습니다.
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0 dt DATETIME DEFAULT 0 );
ON UPDATE CURRENT_TIMESTAMP
절과 상수DEFAULT
절을 사용하면 컬럼은 현재의 타임 스탬프가 자동으로 업데이트되어 소정의 상수 기본값이 있습니다.CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP );
ON UPDATE CURRENT_TIMESTAMP
절을 사용하지만DEFAULT
절을 사용하지 않는 경우, 컬럼은 자동으로 현재의 타임 스탬프로 업데이트되고 기본값으로 현재의 타임 스탬프는 사용되지 않습니다.이 경우 기본값은 형식에 따라 다릅니다.
TIMESTAMP
는NULL
속성을 사용하여 정의되지 않는 한 (이 경우 기본값은NULL
입니다) 기본값은 0입니다.CREATE TABLE t1 ( ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP - default 0 ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP - default NULL );
DATETIME
은NOT NULL
속성으로 정의되어 있지 않는 한 (이 경우 기본값은 0입니다) 기본은NULL
입니다.CREATE TABLE t1 ( dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP - default NULL dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP - default 0 );
TIMESTAMP
및 DATETIME
컬럼은 명시 적으로 지정되지 않는 한 자동 등록하지 않습니다. 그러나 DEFAULT CURRENT_TIMESTAMP
및 ON UPDATE CURRENT_TIMESTAMP
가치도 명시 적으로 지정되지 않은 경우 기본적으로 처음 TIMESTAMP
컬럼에 모두 존재합니다. 첫번째 TIMESTAMP
컬럼에 대해 자동 등록하지 않으려면 다음 중 하나의 전략을 사용합니다.
explicit_defaults_for_timestamp
시스템 변수를 사용합니다. 이 변수가 활성화되면 자동 초기화 및 업데이트 기능을 지정하는DEFAULT CURRENT_TIMESTAMP
및ON UPDATE CURRENT_TIMESTAMP
절은 사용 가능하지만, 컬럼 정의에 명시 적으로 포함되어 있지 않은 한, 어느TIMESTAMP
컬럼에 할당 할 수 없습니다 .또는
explicit_defaults_for_timestamp
가 잘못된 경우 (디폴트) 다음 중 하나를 수행합니다.상수의 기본값을 지정하는
DEFAULT
절을 포함 컬럼을 정의합니다.NULL
속성을 지정합니다. 또한이를 통해 컬럼에서NULL
값이 허용됩니다. 즉, 컬럼을NULL
로 설정하여 현재의 타임 스탬프를 할당 할 수 없습니다.NULL
을 지정하면 컬럼은NULL
로 설정됩니다.
다음 테이블 정의를 고려하십시오.
CREATE TABLE t1 ( ts1 TIMESTAMP DEFAULT 0 ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t2 ( ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t3 ( ts1 TIMESTAMP NULL DEFAULT 0 ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
테이블에는 다음과 같은 특성이 있습니다.
각 테이블 정의에서 첫번째
TIMESTAMP
컬럼은 자동 초기화 또는 업데이트 기능은 없습니다.각 테이블에서는
ts1
컬럼에NULL
값을 처리하는 방법이 다릅니다.t1
의 경우ts1
은NOT NULL
이며, 이에NULL
값을 지정하면 현재 타임 스탬프로 설정됩니다.t2
와t3
의 경우ts1
는NULL
을 사용할 수 있으며, 이에NULL
값을 지정하면NULL
로 설정됩니다.t2
와t3
는ts1
의 기본값이 다릅니다.t2
의 경우ts1
는NULL
을 허용하도록 정의되어 있기 때문에, 명시적인DEFAULT
절이 없으면 기본도NULL
입니다.t3
의 경우ts1
는NULL
을 사용할 수 있지만 명시 적 기본값은 0입니다.
TIMESTAMP
또는 DATETIME
컬럼 정의 중 하나에 명시적인 소수 초 정밀도 값이 포함 된 경우, 컬럼 정의 걸쳐 동일한 값을 사용해야합니다. 다음의 경우 허용됩니다.
CREATE TABLE t1 ( ts TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP (6) ON UPDATE CURRENT_TIMESTAMP (6) );
다음의 경우는 허용되지 않습니다.
CREATE TABLE t1 ( ts TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP (3) );
MySQL 5.6.5 이전의 자동 타임 스탬프 프로퍼티
MySQL 5.6.5 이전에는, 자동 초기화 및 업데이트 기능의 지원은 매우 제한적입니다.
DEFAULT CURRENT_TIMESTAMP
및ON UPDATE CURRENT_TIMESTAMP
은DATETIME
컬럼으로 사용할 수 없습니다.DEFAULT CURRENT_TIMESTAMP
및ON UPDATE CURRENT_TIMESTAMP
는 테이블 당 최대 하나의TIMESTAMP
컬럼에서만 사용할 수 없습니다. 현재 타임 스탬프를 한 컬럼의 기본값으로하고 다른 컬럼의 자동 갱신 값은 없습니다.
이러한 특성을 사용하든, 어떤 TIMESTAMP
컬럼에 필요한 하나를 선택할 수 있습니다. 이것은 자동으로 초기화되거나 현재의 타임 스탬프가 자동으로 갱신되는 테이블에서 첫 번째 열 필요가 없습니다. 다른 TIMESTAMP
컬럼에 대한 자동 초기화 또는 업데이트를 지정하려면 위에서 설명한대로 첫 번째 컬럼에 대한 자동 등록을 제한해야합니다. 이 경우 다른 TIMESTAMP
컬럼은 DEFAULT
및 ON UPDATE
절은 처음의 TIMESTAMP
컬럼의 경우와 동일하지만 두 어구를 생략하면 자동 초기화도 업데이트도하지 않습니다.
TIMESTAMP 초기화 및 NULL 속성
기본적으로 TIMESTAMP
컬럼은 NOT NULL
이며, NULL
값을 포함 할 수 없으며 NULL
을 지정하면 현재 타임 스탬프가 할당됩니다. NULL
을 포함하는 TIMESTAMP
컬럼을 허용하려면 NULL
속성으로 명시 적으로 선언합니다. 이 경우 다른 기본값을 지정하는 DEFAULT
절에서 대체되지 않는 한 기본값이 NULL
입니다. DEFAULT NULL
을 사용하면 기본값으로 NULL
을 명시 적으로 지정할 수 있습니다. ( NULL
속성이 선언되지 않은 TIMESTAMP
컬럼의 경우 DEFAULT NULL
은 사용할 수 없습니다.) TIMESTAMP
컬럼에 NULL
값을 허용하면 NULL
을 지정하면,이 컬럼은 현재의 타임 스탬프가 아닌 NULL
로 설정됩니다.
다음 테이블에는 NULL
값을 허용하는 여러 TIMESTAMP
컬럼이 포함되어 있습니다.
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0 ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
NULL
값을 허용하는 TIMESTAMP
컬럼은 다음 중 하나에 해당하는 경우를 제외하고는 삽입시에 현재의 타임 스탬프를 가지고 있지 않습니다.
디폴트 값이
CURRENT_TIMESTAMP
로 정의 된 컬럼에 값이 지정되지 않은CURRENT_TIMESTAMP
또는NOW()
등의 그 중 하나의 동의어가 명시 적으로 컬럼에 삽입되어있는
즉, NULL
값을 허용하도록 정의 된 TIMESTAMP
컬럼은, 정의에 DEFAULT CURRENT_TIMESTAMP
가 포함되어있는 경우에만 자동 초기화합니다.
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
TIMESTAMP
컬럼에 NULL
값을 허용하고 있지만, 정의에 DEFAULT CURRENT_TIMESTAMP
가 포함되어 있지 않은 경우, 현재 날짜와 시간에 해당하는 값을 명시 적으로 삽입해야합니다. t1
및 t2
테이블에 다음의 정의가 있다고합니다.
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00'); CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT NULL);
삽입 할 때 어느 테이블의 TIMESTAMP
컬럼을 현재 타임 스탬프로 설정하려면 명시 적으로 그 컬럼에 값을 할당합니다. 예 :
INSERT INTO t1 VALUES (NOW ()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);