みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

レコード新規・編集時に自動で作成・編集日時を追加

MYSQLにて(PHPMYADMIN上でテスト)

●レコード挿入(追加・新規作成)時は、
「Pt_create」と「Pt_update」の2つのフィールドに自動で現在時刻を作成

●レコード編集時は
「Pt_update」のみ自動で現在時刻を上書き

というありがちで申し訳ないですが、実行したいです。

現在調べたところ、

一番スマートでない方法は、
*******************************

Pt_createのほうに、種別:DATETIME
Pt_updateのほうに、種別:DATETIME

PHP側にて、$today = date("Y-m-d H:i:s");を取得して、

新規作成時・・・
$sql = INSERT INTO (`Pt_create`,`Pt_update`) VALUES ('".$today."','".$today."')・・

編集時・・・
$sql = UPDATE SET Pt_update= '".$today."'・・

*******************************
ですよね?


できたらSQLのほうで自動でやれるだけやってほしいのですが、
今は、
*******************************

Pt_createのほうに、種別:DATETIME
Pt_updateのほうに、種別:TIMESTAMP、属性:on update CURRENT_TIMESTAMP

PHP側にて、$today = date("Y-m-d H:i:s");を取得して、

新規作成時・・・
$sql = INSERT INTO (`Pt_create`) VALUES ('".$today."')・・

*******************************
ここまで省略できました。

これが限界でしょうか。
種別:TIMESTAMPを2つ設置したらうまく動作しなかったもので。

投稿日時 - 2011-05-13 12:28:03

QNo.6734343

困ってます

質問者が選んだベストアンサー

えっと、省略であれば後者でいいと思います。
ただ、timestmpとdatetimeはどちらも日付型で似たような物すが、厳密に言うと全く別の物です。
まず、サポートしている範囲が違います。
timestmp:'1970-01-01 00:00:00' ~ 2037 年の一定の時点
datetime:'1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
さらには消費バイトも違います。timestmpは4バイトでdatetimeは8バイト
もし、RDBMSに依存しないような作りにするのであればtimestmp型を使うのがいいですが・・
MySQLのtimestmpは特殊仕様なので、MySQLでは私はdatetime型を使ってます。timestmpは楽ですが・・MySQLが自動でやってくれちゃうので想定外とかありそうで怖いので・・
なので、前者の方法で突っ込むのが私のやり方ですね。
新規作成時・・・
$sql = INSERT INTO (`Pt_create`,`Pt_update`) VALUES (now(), now())・・
編集時・・・
$sql = UPDATE SET Pt_update= now()

投稿日時 - 2011-05-13 12:46:37

お礼

ありがとうございます。

タイムスタンプが特殊仕様とはどういうことでしょう。
前者が遠回りなようで、実装されている人もいることをしり新たな発見でした。
どちらにしようか考えて見ます。

DATETIMEだとバイト数が2倍なのですね。
大規模DBの構築となると関係してきそうですね。
はやくそんなシステムを作る仕事ができたらいいですけど。

投稿日時 - 2011-05-13 23:06:19

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

TIMESTAMP型は1テーブルに1つですからね
Pt_createをdatetime,Pt_updateをtimestampにするので問題ないでしょう。

そもそもPHPで日付をつくらなくてもMySQLにだって現時刻をとる日付関数はあります

INSERT INTO (`Pt_create`) VALUES(NOW());

投稿日時 - 2011-05-13 12:44:36

お礼

ありがとうございました!

Now()があるのですね。でも同じようなことする人多そうなのに、
なぜタイムスタンプは1テーブルに1個なのでしょうか。

投稿日時 - 2011-05-13 23:03:22

あなたにオススメの質問