Loading...
MySQL 9.5 Reference Manual 9.5의 13.2.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
TIMESTAMP 및 DATETIME 컬럼은 자동으로 현재 날짜와 시간(즉, 현재 타임스탬프)으로 초기화되거나 갱신될 수 있습니다.
테이블 내의 아무 TIMESTAMP 또는 DATETIME 컬럼에 대해, 현재 타임스탬프를 기본값, 자동 갱신 값, 또는 둘 다로 지정할 수 있습니다:
자동 초기화 컬럼은 행을 INSERT할 때 그 컬럼에 값을 지정하지 않으면 현재 타임스탬프로 설정됩니다.
자동 갱신 컬럼은 행 내의 다른 아무 컬럼의 값이 현재 값에서 변경될 때 자동으로 현재 타임스탬프로 갱신됩니다. 자동 갱신 컬럼은 다른 모든 컬럼이 그들의 현재 값으로 설정된 경우에는 변경되지 않습니다. 다른 컬럼이 변경될 때 자동 갱신 컬럼이 갱신되는 것을 막으려면, 해당 컬럼을 명시적으로 현재 값으로 설정하십시오. 다른 컬럼이 변경되지 않더라도 자동 갱신 컬럼을 갱신하려면, 그 컬럼을 가져야 할 값(예를 들어 CURRENT_TIMESTAMP 등)으로 명시적으로 설정하십시오.
추가로, explicit_defaults_for_timestamp 시스템 변수가 비활성화된 경우, 아무 TIMESTAMP 컬럼(DATETIME은 아님)을 NULL 값을 할당하여 현재 날짜와 시간으로 초기화하거나 갱신할 수 있습니다. 단, 그 컬럼이 NULL 속성으로 정의되어 NULL 값을 허용하도록 되어 있지 않은 경우에만 그렇습니다.
자동 속성을 지정하려면, 컬럼 정의에서 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을 사용합니다. 이 기본값은 엄격 SQL 모드나 NO_ZERO_DATE SQL 모드가 활성화되어 있는지에 따라 경고 또는 오류를 발생시킬 수 있습니다. TRADITIONAL SQL 모드에는 엄격 모드와 NO_ZERO_DATE가 포함되어 있다는 점에 유의하십시오. Section 7.1.11, “Server SQL Modes”를 참조하십시오.
TIMESTAMP 또는 DATETIME 컬럼 정의는 기본값과 자동 갱신 값 모두에 대해, 둘 중 하나에만, 또는 둘 다에 대해서 현재 타임스탬프를 지정하거나, 둘 다에 대해 지정하지 않을 수 있습니다. 서로 다른 컬럼은 자동 속성의 서로 다른 조합을 가질 수 있습니다. 다음 규칙은 가능한 경우를 설명합니다:
DEFAULT CURRENT_TIMESTAMP와 ON UPDATE CURRENT_TIMESTAMP를 둘 다 사용하는 경우, 컬럼은 기본값으로 현재 타임스탬프를 가지며, 자동으로 현재 타임스탬프로 갱신됩니다.1CREATE TABLE t1 ( 2 ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 3 dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 4);
DEFAULT 절은 있지만 ON UPDATE CURRENT_TIMESTAMP 절이 없는 경우, 컬럼은 주어진 기본값을 가지며 현재 타임스탬프로 자동 갱신되지 않습니다.
기본값은 DEFAULT 절이 CURRENT_TIMESTAMP를 지정하는지 상수를 지정하는지에 따라 달라집니다. CURRENT_TIMESTAMP인 경우, 기본값은 현재 타임스탬프입니다.
1CREATE TABLE t1 ( 2 ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 3 dt DATETIME DEFAULT CURRENT_TIMESTAMP 4);
상수인 경우, 기본값은 주어진 값입니다. 이 경우, 컬럼은 어떠한 자동 속성도 갖지 않습니다.
1CREATE TABLE t1 ( 2 ts TIMESTAMP DEFAULT 0, 3 dt DATETIME DEFAULT 0 4);
ON UPDATE CURRENT_TIMESTAMP 절과 상수 DEFAULT 절이 있는 경우, 컬럼은 현재 타임스탬프로 자동 갱신되며 지정된 상수 기본값을 가집니다.1CREATE TABLE t1 ( 2 ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP, 3 dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 4);
ON UPDATE CURRENT_TIMESTAMP 절은 있지만 DEFAULT 절이 없는 경우, 컬럼은 현재 타임스탬프로 자동 갱신되지만 기본값으로 현재 타임스탬프를 갖지는 않습니다.
이 경우 기본값은 타입에 따라 다릅니다. TIMESTAMP는 NULL 속성으로 정의되지 않은 한 기본값이 0이며, NULL 속성으로 정의된 경우 기본값은 NULL입니다.
1CREATE TABLE t1 ( 2 ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- default 0 3 ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL 4);
DATETIME의 기본값은 NULL이며, NOT NULL 속성으로 정의된 경우 기본값은 0입니다.
1CREATE TABLE t1 ( 2 dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP, -- default NULL 3 dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0 4);
TIMESTAMP 및 DATETIME 컬럼은 명시적으로 지정되지 않는 한 자동 속성을 갖지 않습니다. 단, 다음 예외가 있습니다: explicit_defaults_for_timestamp 시스템 변수가 비활성화된 경우, 첫 번째 TIMESTAMP 컬럼은 DEFAULT CURRENT_TIMESTAMP 또는 ON UPDATE CURRENT_TIMESTAMP가 명시적으로 지정되지 않았을 때 둘 다를 갖습니다.
첫 번째 TIMESTAMP 컬럼에 대한 자동 속성을 억제하려면 다음 전략 중 하나를 사용하십시오:
explicit_defaults_for_timestamp 시스템 변수를 활성화합니다. 이 경우, 자동 초기화 및 갱신을 지정하는 DEFAULT CURRENT_TIMESTAMP 및 ON UPDATE CURRENT_TIMESTAMP 절을 사용할 수 있지만, 컬럼 정의에 명시적으로 포함되지 않는 한 어느 TIMESTAMP 컬럼에도 자동으로 할당되지 않습니다.
또는 explicit_defaults_for_timestamp가 비활성화된 경우, 다음 중 하나를 수행하십시오:
상수 기본값을 지정하는 DEFAULT 절로 컬럼을 정의합니다.
NULL 속성을 지정합니다. 이는 또한 컬럼이 NULL 값을 허용하게 하므로, 컬럼을 NULL로 설정하여 현재 타임스탬프를 할당할 수 없다는 의미입니다. NULL을 할당하면 컬럼은 현재 타임스탬프가 아니라 NULL로 설정됩니다. 현재 타임스탬프를 할당하려면, 컬럼을 CURRENT_TIMESTAMP 또는 NOW()와 같은 시노님으로 설정하십시오.
다음 테이블 정의를 살펴보십시오:
1CREATE TABLE t1 ( 2 ts1 TIMESTAMP DEFAULT 0, 3 ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 4 ON UPDATE CURRENT_TIMESTAMP); 5CREATE TABLE t2 ( 6 ts1 TIMESTAMP NULL, 7 ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 8 ON UPDATE CURRENT_TIMESTAMP); 9CREATE TABLE t3 ( 10 ts1 TIMESTAMP NULL DEFAULT 0, 11 ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 12 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 컬럼 정의가 어디에서든 명시적인 소수 초 정밀도 값을 포함하는 경우, 컬럼 정의 전체에서 동일한 값을 사용해야 합니다. 다음은 허용됩니다:
1CREATE TABLE t1 ( 2 ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) 3);
다음은 허용되지 않습니다:
1CREATE TABLE t1 ( 2 ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3) 3);
explicit_defaults_for_timestamp 시스템 변수가 비활성화된 경우, TIMESTAMP 컬럼은 기본적으로 NOT NULL이며 NULL 값을 포함할 수 없고, NULL을 할당하면 현재 타임스탬프가 할당됩니다.
TIMESTAMP 컬럼이 NULL을 포함할 수 있도록 허용하려면, NULL 속성을 명시적으로 선언해야 합니다. 이 경우, DEFAULT 절로 다른 기본값을 지정해 오버라이드하지 않는 한 기본값 또한 NULL이 됩니다. DEFAULT NULL은 기본값으로 NULL을 명시적으로 지정하는 데 사용할 수 있습니다. (NULL 속성으로 선언되지 않은 TIMESTAMP 컬럼에 대해서는 DEFAULT NULL이 유효하지 않습니다.) TIMESTAMP 컬럼이 NULL 값을 허용하는 경우, NULL을 할당하면 현재 타임스탬프가 아니라 NULL로 설정됩니다.
다음 테이블은 NULL 값을 허용하는 여러 TIMESTAMP 컬럼을 포함합니다:
1CREATE TABLE t 2( 3 ts1 TIMESTAMP NULL DEFAULT NULL, 4 ts2 TIMESTAMP NULL DEFAULT 0, 5 ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP 6);
NULL 값을 허용하는 TIMESTAMP 컬럼은 다음 조건 중 하나에 해당하는 경우를 제외하고는 INSERT 시점에 현재 타임스탬프를 갖지 않습니다:
기본값이 CURRENT_TIMESTAMP로 정의되어 있고 컬럼에 대해 아무 값도 지정되지 않은 경우
CURRENT_TIMESTAMP 또는 NOW()와 같은 시노님이 명시적으로 컬럼에 INSERT되는 경우
다시 말해, NULL 값을 허용하도록 정의된 TIMESTAMP 컬럼은 정의에 DEFAULT CURRENT_TIMESTAMP가 포함된 경우에만 자동 초기화됩니다:
1CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
TIMESTAMP 컬럼이 NULL 값을 허용하지만 정의에 DEFAULT CURRENT_TIMESTAMP가 포함되어 있지 않으면, 현재 날짜와 시간에 해당하는 값을 명시적으로 INSERT해야 합니다. 예를 들어, 테이블 t1과 t2가 다음과 같이 정의되어 있다고 가정합니다:
1CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00'); 2CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT NULL);
두 테이블 중 어느 쪽이든, INSERT 시점에 TIMESTAMP 컬럼을 현재 타임스탬프로 설정하려면 명시적으로 그 값을 할당해야 합니다. 예를 들어:
1INSERT INTO t2 VALUES (CURRENT_TIMESTAMP); 2INSERT INTO t1 VALUES (NOW());
explicit_defaults_for_timestamp 시스템 변수가 활성화된 경우, TIMESTAMP 컬럼은 NULL 속성으로 선언된 경우에만 NULL 값을 허용합니다. 또한, TIMESTAMP 컬럼은 NULL 또는 NOT NULL 속성으로 선언되었는지에 상관없이 NULL을 할당하여 현재 타임스탬프를 할당하는 것을 허용하지 않습니다. 현재 타임스탬프를 할당하려면, 컬럼을 CURRENT_TIMESTAMP 또는 NOW()와 같은 시노님으로 설정하십시오.
13.2.4 The YEAR Type
13.2.6 Fractional Seconds in Time Values