MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

11.2.5 TIMESTAMP および DATETIME の自動初期化および更新機能

TIMESTAMP および DATETIME のカラムは、自動的に初期化して現在の日時 (つまり、現在のタイムスタンプ) に更新できます。

テーブル内のあらゆる TIMESTAMP または DATETIME カラムに対して、デフォルト値または自動更新値、あるいはその両方として、現在のタイムスタンプを割り当てることができます。

また、explicit_defaults_for_timestamp システム変数が無効になっている場合は、NULL 値を許可するように NULL 属性で定義されていないかぎり、NULL 値を割り当てることで、任意の TIMESTAMP (DATETIME 以外) カラムを現在の日時に初期化または更新できます。

自動プロパティーを指定するには、カラム定義で DEFAULT CURRENT_TIMESTAMP および ON UPDATE CURRENT_TIMESTAMP 句を使用します。 句の順序は関係ありません。 両方がカラム定義にある場合、どちらも最初に実行できます。 CURRENT_TIMESTAMP のシノニムのいずれも、CURRENT_TIMESTAMP と同じ意味があります。 これらは、CURRENT_TIMESTAMP()NOW()LOCALTIMELOCALTIME()LOCALTIMESTAMP、および LOCALTIMESTAMP() です。

DEFAULT CURRENT_TIMESTAMP および ON UPDATE CURRENT_TIMESTAMP の使用は、TIMESTAMP および DATETIME に固有です。 DEFAULT 句を使用して、定数 (非自動) のデフォルト値 (DEFAULT 0DEFAULT '2000-01-01 00:00:00'など) を指定することもできます。

注記

次の例では、厳密な SQL モードと NO_ZERO_DATE SQL モードのどちらが有効になっているかに応じて警告またはエラーを生成できるデフォルトの DEFAULT 0 を使用します。 TRADITIONAL SQL モードには、厳密モードおよび NO_ZERO_DATE が含まれることに注意してください。 セクション5.1.11「サーバー SQL モード」を参照してください。

TIMESTAMP または DATETIME カラム定義では、現在のタイムスタンプをデフォルト値と自動更新値の両方に対して指定することも、どちらか一方について指定することも、両方について指定しないこともできます。 異なるカラムは、自動プロパティーの別々の組み合わせを持つことができます。 次のルールは可能性のある場合について記述しています。

TIMESTAMP および DATETIME のカラムには、明示的に指定しないかぎり、自動プロパティはありませんが、この例外があります: explicit_defaults_for_timestamp システム変数が無効になっている場合、first TIMESTAMP カラムに DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP の両方が含まれます (どちらも明示的に指定されていない場合)。 最初の TIMESTAMP カラムについて自動プロパティーを抑制するには、次のいずれかの戦略を使用します。

次のテーブル定義を考慮してください。

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 または 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 カラムは、次のいずれかの状況に当てはまる場合を除き、挿入時に現在のタイムスタンプを取りません

つまり、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() などのシノニムに設定します。