Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


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

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

MySQL 5.6.5 以降では、TIMESTAMP および DATETIME カラムを自動的に初期化でき、現在の日付および時間 (つまり、現在のタイムスタンプ) に自動的に更新できます。5.6.5 より前では、これは TIMESTAMP にしか当てはまらず、テーブルあたり最大で 1 つの 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()LOCALTIMELOCALTIME()LOCALTIMESTAMP、および LOCALTIMESTAMP() です。

DEFAULT CURRENT_TIMESTAMP および ON UPDATE CURRENT_TIMESTAMP の使用は、TIMESTAMP および DATETIME に固有です。DEFAULT 句も、DEFAULT 0DEFAULT '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_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 カラムには、明示的に指定されないかぎり自動プロパティーはありません。ただし、DEFAULT CURRENT_TIMESTAMPON 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 の場合、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)
);

MySQL 5.6.5 より前の自動タイムスタンププロパティー

MySQL 5.6.5 より前では、自動初期化および更新機能のサポートは非常に限定的です。

  • DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP は、DATETIME カラムで使用できません。

  • DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP は、テーブルあたり最大で 1 つの 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);

User Comments
Sign Up Login You must be logged in to post a comment.