TIMESTAMP
カラムは
DATETIME
カラムと同じフォーマットで表示されます。言い換えると、表示幅は
19 文字に決められていて、形式は
'YYYY-MM-DD HH:MM:SS'
です。
TIMESTAMP
型の値は、格納するときに現在のタイムゾーンから
UTC に変換され、取り出すときに UTC
から現在のタイムゾーンに変換されます。(この変換が行われるのは、TIMESTAMP
データ型の場合だけで、DATETIME
などのほかのデータ型では行われません。)デフォルトでは、接続ごとの現在のタイムゾーンはサーバーの時刻です。タイムゾーンの設定は、MySQL Server Time Zone Supportに説明されているように、接続ごとに行うことができます。タイムゾーン設定が一定であるかぎり、格納した値と同じ値を復帰させることができます。TIMESTAMP
値を格納したあとで、タイムゾーンを変更して値を取り出すと、取り出された値は格納した値とは異なります。これは、同じタイムゾーンが両方向への変換に利用されなかったために起こります。現在のタイムゾーンは、time_zone
システム変数の値のように有効です。
TIMESTAMP
データ型には、自動初期化および自動更新機能が備わっています。これらの特性を使用するかどうか、またどのカラムに持たせるかを選択することができます。
テーブル内の 1 つの
TIMESTAMP
カラムに対して、現在のタイムスタンプをデフォルト値と自動更新値として指定することができます。現在のタイムスタンプを、カラムを初期化するデフォルト値にすること、または自動更新のデフォルト値にすること、またはその両方にすることが可能です。現在のタイムスタンプを、1
つのカラムを初期化するデフォルト値にし、別のカラムの自動更新のデフォルト値にすることは不可能です。
テーブル内の 1 つ 1 つの
TIMESTAMP
カラムは、現在の日時に初期化されるものとしても、自動的に更新されるものとしても使用できます。これは、最初の
TIMESTAMP
カラムである必要はありません。
もし DEFAULT
値がテーブルの最初の
TIMESTAMP
カラムに指定されたら、それは無視されません。CURRENT_TIMESTAMP
、または一定の日付と時刻値がデフォルトになり得ます。
CREATE
TABLE
ステートメントの中では、最初の
TIMESTAMP
カラムは次の方法のどれかで宣言することができます。
DEFAULT
CURRENT_TIMESTAMP
と
ON UPDATE
CURRENT_TIMESTAMP
節の両方で、カラムはそのデフォルトに現在のタイムスタンプを持ち、それは自動的に更新されます。
DEFAULT
と
ON UPDATE
節のどちらも、DEFAULT
CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
とは同じではありません。
DEFAULT
CURRENT_TIMESTAMP
節と、ON UPDATE
ではない節で、カラムはそのデフォルトに現在のタイムスタンプを持ちますが、それは自動的に更新されません。
DEFAULT
節がない、ON UPDATE
CURRENT_TIMESTAMP
がある節では、カラムのデフォルトは 0
で、それは自動的に更新されます。
一定の DEFAULT
値を使用している場合、カラムには特定のデフォルトが含まれているため、現在のタイムスタンプに自動的に初期化されません。カラムに
ON UPDATE
CURRENT_TIMESTAMP
節が含まれている場合、カラムは自動的に更新されます。そうでない場合は、一定のデフォルトがあるため、自動的に更新されません。
言い換えると、現在のタイムスタンプを初期値と自動更新値の両方、またはそのどちらかに利用することができる、または、両方とも利用しないことも可能です。(たとえば、自動初期化されたカラムを持たずに自動更新を可能にするために
ON UPDATE
を指定することが可能です)。次のカラム定義は、それぞれの可能性を示しています。
自動初期化および自動更新
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
自動初期化のみ
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
自動更新のみ
ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
どちらもなし
ts TIMESTAMP DEFAULT 0
最初の
TIMESTAMP
カラム以外のカラムに対して自動デフォルトや自動更新を指定するには、一定の
DEFAULT
値
(たとえば、DEFAULT
0
や DEFAULT
'2003-01-01 00:00:00'
)
を明示的に割り当てることによって、最初の
TIMESTAMP
カラムに対する自動初期化および自動更新動作を抑制する必要があります。そして、それ以外の
TIMESTAMP
カラムに対しては、DEFAULT
と ON UPDATE
節の両方を削除しなければ規則は最初の
TIMESTAMP
カラムと同じで、自動初期化や更新は行われません。
例 :
CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
CURRENT_TIMESTAMP
またはその同義語
(CURRENT_TIMESTAMP()
、NOW()
、LOCALTIME
、LOCALTIME()
、LOCALTIMESTAMP
、または
LOCALTIMESTAMP()
)
は DEFAULT
と
ON UPDATE
節の中で利用することができます。それらはすべて「現在のタイプスタンプ」を意味します
(UTC_TIMESTAMP
は使用できません)。現在のタイムゾーンが
UTC
でないかぎり、その値の範囲は
TIMESTAMP
カラムの値の範囲と並びません)。
DEFAULT
と
ON UPDATE
属性の順番は関係ありません。もし
DEFAULT
と
ON UPDATE
の両方が
TIMESTAMP
カラムに指定されると、どちらかがもう片方に先行します。たとえば、これらのステートメントは同等になります。
CREATE TABLE t (ts TIMESTAMP); CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
NO_ZERO_DATE
SQL
モードが有効になっている場合は、DEFAULT
0
を使用する例が機能しません。これは、そのモードによって「ゼロ」のデータ値
(0
、'0000-00-00
、または
'0000-00-00 00:00:00'
として指定)
が拒否されるからです。TRADITIONAL
SQL モードに
NO_ZERO_DATE
が含まれていることに注意してください。
TIMESTAMP
カラムはデフォルトで NOT
NULL
になっているため、NULL
値を含めることはできません。NULL
を指定すると、現在のタイプスタンプが割り当てられます。ただし、NULL
属性を使って
TIMESTAMP
カラムを宣言することで、そのカラムに
NULL
を含めることができます。この場合、異なるデフォルト値を指定する
DEFAULT
節で上書きされないかぎり、デフォルト値も
NULL
になります。DEFAULT
NULL
を使用すると、デフォルト値として
NULL
を明示的に指定できます。(TIMESTAMP
カラムが NULL
属性を使って宣言されていない場合、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
として定義されます。
NOW()
か
CURRENT_TIMESTAMP
がカラムに挿入されます。
言い換えると、NULL
として定義された
TIMESTAMP
カラムは次のような定義を利用して作成されたときだけ自動初期化します。
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
そうでない場合、つまり、次に示すように
TIMESTAMP
カラムが DEFAULT
CURRENT_TIMESTAMP
を使用しないで
NULL
値を許可するように定義されている場合は
…
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT NULL); CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');
… 現在の日付と時刻に対応した値を明示的に挿入する必要があります。次に例を示します。
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
MySQL
サーバーは、MAXDB
SQL
モードが有効になっているときに実行できます。このモードが有効な状態でサーバーが実行されたとき、TIMESTAMP
は DATETIME
と同一です。これは、もしテーブルが作成されたときにこのモードが有効だと、TIMESTAMP
カラムは
DATETIME
カラムとして作成される、という意味になります。その結果、そのようなカラムは
DATETIME
表示フォーマットを利用し、同じ範囲の値を持ち、自動初期化機能や、現在の日付と時刻に自動的にアップデートする機能はないということになります。
MAXDB
モードを有効にするには、起動時に
--sql-mode=MAXDB
サーバーオプションを使用するか、実行時にグローバルな
sql_mode
変数を設定して、サーバーの SQL モードを
MAXDB
に設定します。
mysql> SET GLOBAL sql_mode=MAXDB;
クライアントは接続のために、次のようにサーバーを
MAXDB
モードで起動させることができます。
mysql> SET SESSION sql_mode=MAXDB;