MYSQLでレコードの新規・編集時に自動で作成・編集日時を追加する方法

このQ&Aのポイント
  • MYSQLにて、レコードの新規・編集時に自動で作成・編集日時を追加する方法について説明します。
  • 一番スマートでない方法は、Pt_createとPt_updateの2つのフィールドをDATETIME型とし、PHPで現在時刻を取得してSQL文で追加・更新する方法です。
  • よりスマートな方法は、Pt_createフィールドをDATETIME型とし、Pt_updateフィールドをTIMESTAMP型で属性をon update CURRENT_TIMESTAMPとする方法です。PHPで現在時刻を取得し、SQL文でPt_createに追加し、Pt_updateは自動で更新されます。
回答を見る
  • ベストアンサー

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

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つ設置したらうまく動作しなかったもので。

  • MySQL
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • kool_noah
  • ベストアンサー率33% (95/285)
回答No.2

えっと、省略であれば後者でいいと思います。 ただ、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()

raryrary
質問者

お礼

ありがとうございます。 タイムスタンプが特殊仕様とはどういうことでしょう。 前者が遠回りなようで、実装されている人もいることをしり新たな発見でした。 どちらにしようか考えて見ます。 DATETIMEだとバイト数が2倍なのですね。 大規模DBの構築となると関係してきそうですね。 はやくそんなシステムを作る仕事ができたらいいですけど。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

TIMESTAMP型は1テーブルに1つですからね Pt_createをdatetime,Pt_updateをtimestampにするので問題ないでしょう。 そもそもPHPで日付をつくらなくてもMySQLにだって現時刻をとる日付関数はあります INSERT INTO (`Pt_create`) VALUES(NOW());

raryrary
質問者

お礼

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

関連するQ&A

  • PL/SQLによるCREATE TABLE後のINSERTができない

    いつもお世話になっております。 次で、PL/SQLで自動的に表tbを作成し、日時を挿入することを試みています。 BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tb (t TIMESTAMP)'; INSERT INTO tb VALUES(SYSTIMESTAMP); END; / 実行すると、tbが作られていない旨のエラーになってしまいます。 INSERT部分がなければ、表tbは作成できます。 表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。 何卒よろしくお願いいたします。

  • [MYSQL]TIMESTAMPをWHERE句に指定しUPDATEする方法

    以下のようにテーブルを作成し、TIMESTAMP型のカラムをキーにUPDATEをしたいと考えています。 create table test(time timestamp, amount int); insert into test values('2008-01-07 19:15:12',0); update test set amount = -1 where time = '2008-01-07 19:15:12'; ところがMYSQLではUPDATE後、TIMESTAMPのカラムが2008年から2009年に変化します。ORACLEで試しましたが、TIMESTAMP型のカラムは変わりませんでした。 +---------------------+--------+ | time | amount | +---------------------+--------+ | 2009-06-30 10:04:53 | -1 | +---------------------+--------+ MYSQLの独自の仕様があるのでしょうか? MYSQL 5.1.35(mysql-essential-5.1.35-win32.msi) Windows 2003 Server Standard Edition R2 MYISAM

    • ベストアンサー
    • MySQL
  • PHPでInsertを実行したら空白のレコードが追加される

    PostgreSQL 8.0.1 PHP 4 Apache 1.3 で環境を構築しています。 PHPで、 $sql=sprintf("insert into records values('20','test2','cal')"); と入力し実行すると、きれいにDBに登録できるのですが、 $sql=sprintf("insert into records values('%s','%s','%s')",$no,$name,$address); と入力したら、DBには空白で登録されてしまいます。 何がおかしいのか検討が付かなくて困っております 宜しくお願い致します。

  • SQL Server 2005 Express で CDate()関数の代替?

    SQL Server 2005 Expressで Create table Test( date_test datetime ); に追記する場合cdateを使いたいのですが Insert文で 「insert into test(date_test) values(CDate('1999/09/14 23:23:00'))」 とすると 「'CDate' は 組み込み関数名 として認識されません。」っと出てしまいます 他の関数名に変わっているのでしょうか??

  • update時にtimestampが更新されない

    昨日SQLについて学び始めたばかりでわからないことが多く、質問させていただきます。 フィールドをtimestamp型で定義すれば、insert時やtimestamp時に自動的に日時が更新されるということですが、なぜかupdate時に更新されません。 insert時にはちゃんと日時が入りますし、insert後にtimestampのカラムにNULLをいれたときも更新されました。なせupdate時だけ更新されないのでしょう?

  • MySQLから取り出したものを3つに分ける

    MySQLに以下のようなSQLを打ちました。 create table table_list( id int, task varchar(255) ); insert into table_list values(1,'ほげほげ1-1'); insert into table_list values(1,'ほげほげ1-2'); insert into table_list values(2,'ほげほげ2-1); insert into table_list values(2,'ほげほげ2-2'); insert into table_list values(3,'ほげほげ3-1'); そして、空のdiv要素が3つあります。 このデータベースからidの数値別に、div要素へtaskの文字列を入れたいのですが、どうすればいいのでしょうか? SQLで「select * from table_list」をやってからtaskを取り出すのか、3回SQLで「select task from table_list where id=1」のようにするのがよろしいんでしょうか?

    • ベストアンサー
    • PHP
  • テーブル作成時にエラー?

    こんにちは。 以下のような環境で操作を行っています。 RedHatLinux9.0 PostgreSQL 8.0.3 テーブル作成時に次のようなメッセージが出力され、テーブルを作成することができません。 NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "PK_SIKYO" for table "TM_SIKYO" ちなみに実行したSQL文は次の通りです。 CREATE TABLE "TOUSHIN"."TM_SIKYO" ( "SHIKYO_CD" int4 NOT NULL DEFAULT nextval('"TOUSHIN"."TM_SIKYO_SHIKYO_CD_seq"'::text), "SHIKYO_NM" varchar(50), "SHIKYO_RNM" varchar(50), "SHOW_FLAG" bool, "UNUSE_FLAG" bool, "CREATE_DATE" timestamp DEFAULT ('now'::text)::timestamp(6) with time zone, "CREATE_ID" varchar(10), "CHANGE_DATE" timestamp DEFAULT ('now'::text)::timestamp(6) with time zone, "CHANGE_ID" varchar(10), CONSTRAINT "PK_SIKYO" PRIMARY KEY ("SHIKYO_CD") ) WITHOUT OIDS; SQL文はWindows版のPostgreSQLから作成したものを、そのままコピーして利用しました。 プライマリーキーが正しく設定できていないようなメッセージだと思うのですが、対処法など詳しいことが分からずに困っています。 Windows版から出力したSQL文なので、SQL文に間違いがありそうな感じでもないですし、一体何が原因なのでしょうか?

  • DOSプロンプトから一度に登録させる方法

    WindowsXPに Oracle10gの無料版が入っています。 テーブルは既に作成しているのですが、データをインポートさせたく SQLを列記してDOSプロンプトから一度に登録させたいのですが、どのようにコマンドすればよいのでしょうか? sqlplusでログイン create table yaoya ( namae varchar2 (100) shohin varchar2 (100) num number (8,2) ); でテーブル作成している。 test.sqlを以下のように作成しました。 insert into yaoya (namae, shohin, num) values ('田中', 'りんご', 10); insert into yaoya (namae, shohin, num) values ('田中', 'みかん', 8); insert into yaoya (namae, shohin, num) values ('田中', 'バナナ', 15); insert into yaoya (namae, shohin, num) values ('伊藤', '梨', 12); insert into yaoya (namae, shohin, num) values ('伊藤', 'イチゴ', 20); insert into yaoya (namae, shohin, num) values ('伊藤', 'メロン', 1); insert into yaoya (namae, shohin, num) values ('松田', 'スイカ', 3);

  • 指定された趣味を持つメンバーがいるグループを抽出するSQL

    グループテーブル、メンバーテーブル、趣味テーブルの3つのテーブルがあります。 あるメンバーはあるグループに属しており、趣味を1つ持っています。 以下がそのSQLです。 CREATE TABLE groups ( g_id int primary key ); CREATE TABLE members ( m_id int primary key , g_id int , h_id int ); CREATE TABLE hobbies ( h_id int primary key, h_name text ); INSERT INTO groups VALUES ( 1 ); INSERT INTO groups VALUES ( 2 ); INSERT INTO groups VALUES ( 3 ); INSERT INTO members VALUES ( 1, 1, 1); INSERT INTO members VALUES ( 2, 1, 3); INSERT INTO members VALUES ( 3, 1, 4); INSERT INTO members VALUES ( 4, 1, 4); INSERT INTO members VALUES ( 5, 2, 1); INSERT INTO members VALUES ( 6, 2, 2); INSERT INTO members VALUES ( 7, 2, 3); INSERT INTO members VALUES ( 8, 3, 2); INSERT INTO members VALUES ( 9, 3, 3); INSERT INTO members VALUES ( 10, 3, 4); INSERT INTO hobbies VALUES ( 1, 'sports' ); INSERT INTO hobbies VALUES ( 2, 'music' ); INSERT INTO hobbies VALUES ( 3, 'book' ); INSERT INTO hobbies VALUES ( 4, 'drive' ); 指定された趣味を持つメンバーがいるグループを抽出するにはどうすればいいでしょうか? 例えば、「読書が趣味なメンバーとドライブが趣味なメンバーがいるグループは?」「グループ1とグループ3」のような感じです。 一応自分で考えてみたのが、以下ですが、これだと趣味の指定が増減すると大きくSQLが変わってしまいます。 もっといいやり方はないでしょうか? 私はPostgreSQL8を使ってますが、汎用的なSQLであれば、そっちの方がいいです。 SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'drive' INTERSECT SELECT distinct m.g_id FROM members m join hobbies h ON m.h_id = h.h_id where h.h_name = 'book';

  • PHPでレコード追加(MYSQL)が出来ません

    以下のようにするとうまくいってたのが、 ひとつフィールドを増やすとうまくいきません。 単純なミスだろうと思い、数時間格闘していますが見つかりません。 よろしくご教授お願いいたします。 MYSQL table mem id vacher(10) name vacher(100) pass varcher(8) regdate date PHP $sql = "insert into mem (id , name , pass ,regdate) values ('$id', '$name', '$pass', now())"; ↓↓↓↓↓↓ MYSQL table mem id vacher(10) name vacher(100) pass varcher(8) regdate date kikan varcher(100) PHP $sql = "insert into mem (id , name , pass ,regdate ,kikan) values ('$id', '$name', '$pass', now() ,'$kikan')";

    • ベストアンサー
    • MySQL