SE_BOKUのITな日常

SE_BOKUが知ってること・勉強したこと・考えたことetc

定義だけで自動的にタイムスタンプを記録する/MariaDB(MySQL)

目次

定義だけで自動的にタイムスタンプを記録する/MariaDBMySQL

テーブルに更新日時を記録するタイムスタンプカラムを追加したいという要件に出くわすことは、よくあります。

MariaDBMySQL)には、こういう用途に超便利な「TIMESTAMP」があります。

mariadb.com

記録フォーマットはDATETIMEと同じ「YYYY-MM-DD HH:MM:SS」ですが、insertやupdate時に自動的に時点の日付時刻を更新してくれるのです。

引用すると。

The timestamp field is generally used to define at which moment in time a row was added or updated and by default will automatically be assigned the current datetime when a record is inserted or updated. 

タイムスタンプフィールドは一般に、行が追加または更新された時点を定義するために使用され、デフォルトでは、レコードが挿入または更新されると、自動的に現在の日付時間が割り当てられます。

となっていて、昔からある便利な機能です。

誰でも知ってそうに思ってたのですが、意外に知らない人がいたので紹介しときます。

 

既存テーブルにAlterで追加する例

create tableの場合だと、TIMESTAMP型で定義するだけなので、既存のテーブルにタイムスタンプを追加するていで、サンプルをします。

例えば「test_master」という名前のこんなテーブル

これに「updated」という名称で「TIMESTAMP」カラムを追加してみます。

DDL文はこんな感じ。

ALTER TABLE test_master ADD updated TIMESTAMP;

実行後「DESC test_master;」してみると。

自動的にDefaultに「current_timestamp()」、Extraに「on update current_timestamp()」が設定されています。

 

updateの場合

タイムスタンプカラムの追加で、updateの場合、既存ソースの修正は必要ないです。

例えば

update test_master set name='changeyo!' where id = 1;

のようにして、updatedカラムの指定はしていなくても結果は

1,1001,changeyo!,2022-07-03 00:52:47

のようにタイムスタンプ項目が時点の日付・時刻で更新されます。

 

insertの場合

insertの場合は「update」とは違います。

insert文にカラム指定があるかどうかで対応が変わります。

次のようにinsert文にカラム指定がある場合は、タイムスタンプカラムを後から追加してもSQLの見直しは必要ありません。

insert into test_master (id,code,name) values(1,'1001','namebo!');

追加した「updated」カラムをSQL文に含めてなくても、実行結果は

1,1001,namebo!,2022-07-03 00:33:33

と、ちゃんとタイムスタンプが更新されます。

でも、insert文が以下のように「カラム指定」を省略していた場合

insert into test_master values(1,'1001','namebo!');

実行すると

Column count doesn't match value count

エラーになります。

カラム数と指定されたvaluesの数が合わないぞと怒られてしまうわけです。

なので、insert文を修正する必要がでてきます。

例えば、デフォルト値を使うよう「default」を追加するなどです。

insert into test_master values(1,'1001','namebo!',default);

ちゃんとしたプロジェクトに参加すると、コーディングルールで「insert文はカラム指定を必ず書くこと」となっていることが多いです。

その理由は、こういうことなのです。

テーブルにあとからカラムを追加したくなることはよくあります。

タイムスタンプカラムにかかわらずです。

insert文にカラム指定があるのと、ないのとでは保守コストが大きく変わります。

ちょっと大きなプロジェクトなら、その差は結構な金額になるわけです。

大事だと思います・・余談でしたけど。

 

まとめ

MariaDBMySQL)のTIMESTAMPでした。

昔は一つのテーブルにひとつのTIMESTAMP列しか存在できないなんてこともありましたが、MariaDB10.0以降はそんな制限もなくなりました。

ガンガン使えばいいと思います。

ではでは。