MySQLで登録日時と更新日時を自動的に設定する

MySQL

 

初心者の時に歯がゆい思いをしたのでメモ。

 

 

昔のバージョンだとNOW()等を使用していた

5.6.5未満のバージョンだとTIMESTAMP型にしかDEFAULT CURRENT_TIMESTAMPを定義できませんでした。

なので登録日と更新日等、複数カラムにCURRENT_TIMESTAMPを使用したい場合は片方をDATETIME型にし、NOW()を使用していたりしました。

業務でたまに古いバージョンのMySQLを触ったりすることがあるので、以下のようなqueryで代用したことがあります。

INSERT INTO test_table
    (id, context, created_at, updated_at)
VALUES
    (1, 'test', NOW());

挿入処理毎に作成日(created_at)をNOW()しているので、もう少しスッキリさせたいところ。

 

もしくはLaravelで以下のようなORマッパーの実行です。

HOGE::getInstance()->save(
    [
        ~
        'created_at' => date('Y-m-d H:i:s'),
    ]);

あまりスマートじゃない…

 

対応方法

5.6.5以降のバージョンだとDATETIME型にもDEFAULT TIMESTAMPを使用することができるようになったので、table定義を以下のようにすればOKです。

CREATE TABLE table_name (
    id INT(10),
    name VARCHAR(10),
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
);

作成時刻は DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

更新時刻は DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPを定義します。

これを設定しておけば登録時と更新時に自動的に現在時刻が挿入されるので、コードがスッキリし可読性向上につながります。

 

参照http://dekokun.github.io/posts/2014-05-31.html

MySQL