TIMESTAMP
および DATETIME
のカラムは、自動的に初期化して現在の日時 (つまり、現在のタイムスタンプ) に更新できます。
テーブル内のあらゆる TIMESTAMP
または DATETIME
カラムに対して、デフォルト値または自動更新値、あるいはその両方として、現在のタイムスタンプを割り当てることができます。
自動初期化されたカラムは、カラムに値を指定しない挿入行に対して現在のタイムスタンプに設定されます。
自動更新されたカラムは、行内のほかのカラムの値がその現在の値から変更されると、現在のタイムスタンプに自動的に更新されます。 自動更新されたカラムは、ほかのすべてのカラムがその現在の値に設定されていれば、変更されないまま保持されます。 ほかのカラムが変更したときに、自動更新したカラムが更新しないようにするには、明示的にこれを現在の値に設定します。 ほかのカラムが変更しない場合でも、自動更新カラムを更新するには、明示的にこれを必要な値に設定します (たとえば
CURRENT_TIMESTAMP
に設定します)。
また、explicit_defaults_for_timestamp
システム変数が無効になっている場合は、NULL
値を許可するように NULL
属性で定義されていないかぎり、NULL
値を割り当てることで、任意の TIMESTAMP
(DATETIME
以外) カラムを現在の日時に初期化または更新できます。
自動プロパティーを指定するには、カラム定義で 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'
など) を指定することもできます。
次の例では、厳密な SQL モードと NO_ZERO_DATE
SQL モードのどちらが有効になっているかに応じて警告またはエラーを生成できるデフォルトの DEFAULT 0
を使用します。 TRADITIONAL
SQL モードには、厳密モードおよび NO_ZERO_DATE
が含まれることに注意してください。 セクション5.1.11「サーバー SQL モード」を参照してください。
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
のカラムには、明示的に指定しないかぎり、自動プロパティはありませんが、この例外があります: explicit_defaults_for_timestamp
システム変数が無効になっている場合、first 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()
などのシノニムに設定します。
次のテーブル定義を考慮してください。
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)
);
TIMESTAMP の初期化と NULL 属性
explicit_defaults_for_timestamp
システム変数が無効になっている場合、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 t2 VALUES (CURRENT_TIMESTAMP);
INSERT INTO t1 VALUES (NOW());
explicit_defaults_for_timestamp
システム変数が有効になっている場合、TIMESTAMP
カラムで NULL
値が許可されるのは、NULL
属性で宣言されている場合のみです。 また、TIMESTAMP
カラムでは、NULL
または NOT NULL
属性で宣言されているかどうかにかかわらず、NULL
を割り当てて現在のタイムスタンプを割り当てることはできません。 現在のタイムスタンプを割り当てるには、カラムを CURRENT_TIMESTAMP
または NOW()
などのシノニムに設定します。