MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  TIMESTAMP および DATETIME の自動初期化および更新機能

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

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

  • DEFAULT CURRENT_TIMESTAMPON 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_TIMESTAMPON 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 の場合、ts1NOT NULL であり、これに NULL の値を割り当てると、現在のタイムスタンプに設定されます。 t2t3 の場合、ts1 では NULL を使用でき、これに NULL の値を割り当てると、NULL に設定されます。

  • t2t3 では、ts1 のデフォルト値が異なります。 t2 の場合、ts1 は、NULL を許可するように定義されているので、明示的な DEFAULT 句がない場合はデフォルトも NULL です。 t3 の場合、ts1NULL を使用できますが、明示的なデフォルトは 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() などのシノニムに設定します。


関連キーワード:  TIMESTAMP, カラム, DEFAULT, UPDATE, 定義, CREATE, TABLE, 更新, 設定, 自動