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);