Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


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 システム変数が無効になっている場合、firstTIMESTAMP カラムに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() などのシノニムに設定します。