注:MySQLの古いバージョン
(4.1以前)の TIMESTAMP
データの性質は、このセクションで紹介されている物とは様々な面で明らかに違いました。古い
TIMESTAMP
データをMySQL
5.1
で利用する為に変換するには、その詳細について
MySQL 3.23, 4.0, 4.1
リファレンスマニュアル
を必ず参照してください。
TIMESTAMP
カラムは
DATETIME
カラムと同じフォーマットで表示されます。言い換えると、表示幅は19文字に決められていて、フォーマットは
YYYY-MM-DD HH:MM:SS
となります。
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;
次に紹介されている情報は、MAXDB
モードが有効な状態で作成されなかったテーブルだけの
TIMESTAMP
カラムに適合するという事を覚えておいて下さい。なぜならば、そのようなカラムは
DATETIME
カラムとして作成されるからです。
MySQLは、日付か月のカラムにゼロを含むタイムスタンプ値や、有効でない日付値は許容しません。このルールの唯一の例外は、'0000-00-00
00:00:00'
の特別値です。
いつ TIMESTAMP
の自動初期化とアップデートが起こるのか、そしてどのカラムがそれらを行うべきなのかを決めるのに、相当な柔軟性があります。
テーブル内の1つの TIMESTAMP
カラムに対して、現在のタイムスタンプをデフォルト値と自動更新値として指定する事ができます。現在のタイムスタンプを、カラムを初期化するデフォルト値にする事、または自動更新のデフォルト値にする事、またはその両方にする事が可能です。現在のタイムスタンプを、1つのカラムを初期化するデフォルト値にし、別のカラムの自動更新のデフォルト値にする事は不可能です。
どのTIMESTAMP
カラムが現在の日付と時刻を自動的に初期化したり更新したりするのか指定する事ができます。これは、最初の
TIMESTAMP
カラムである必要はありません。
次のルールが TIMESTAMP
カラムの初期化と更新を管理しています。
もし DEFAULT
値がテーブルの最初の
TIMESTAMP
カラムに指定されたら、それは無視されません。CURRENT_TIMESTAMP
、または一定の日付と時刻値がデフォルトになり得ます。
最初の
TIMESTAMP
カラムにとって、DEFAULT NULL
は DEFAULT CURRENT_TIMESTAMP
と同じです。それ以外の全ての
TIMESTAMP
カラムにとっては、DEFAULT NULL
は DEFAULT 0
として扱われます。
テーブル内の全ての1つの
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
を指定する事が可能です。)
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);
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); CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
項4.10.8. 「MySQL サーバのタイム ゾーン サポート」
で説明されているように、現在のタイムゾーンをそれぞれの接続ごとに設定する事ができます。TIMESTAMP
値は、現在のタイムゾーンから変換されて格納され、また検索された時に現在のタイムゾーンに再変換されながら、UTCに格納されます。タイムゾーン設定が一定である限り、格納した値と同じ値を復帰させる事ができます。もし
TIMESTAMP
値を格納してから、タイムゾーンを変更して値を検索すると、検索された値は格納した値とは違ってきます。これは、同じタイムゾーンが両方向への変換に利用されなかった為に起こります。現在のタイムゾーンは、time_zone
システム変数の値のように有効です。
カラムが NULL
値を含む事を許容する為に
TIMESTAMP
カラムの定義の中に
NULL
属性を含める事ができます。例:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
もし NULL
属性が指定されていなければ、カラムを
NULL
に設定すると、現在のタイムスタンプに設定されます。NULL
値を許容する TIMESTAMP
カラムは、下記の条件の時以外は現在のタイムスタンプを採用
しない
という事を覚えておいて下さい。
そのデフォルト値は
CURRENT_TIMESTAMP
として定義されます。
NOW()
か
CURRENT_TIMESTAMP
がカラムに挿入されます。
言い換えると、NULL
として定義された TIMESTAMP
カラムは次のような定義を利用して作成された時だけ自動初期化します。
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
そうでなければ—
ここに表されているように、もし
TIMESTAMP
カラムが DEFAULT
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);