サーバー、データベース、インフラに関するトピックス
■第4話:created at、updated atを使おう(データベース)
(最終更新日:2024.11.06)

(絵が小さい場合はスマホを横に)
「履歴が残ってて良かった!」
データベースを扱っていると、データの履歴を追う関係で「いつ作成したか」「いつ更新したか」を確認したい時がある。
そんな時に活躍するのが、created_atとupdated_atだ。
今回はデータベースのフィールド設定、created_atとupdated_atについて説明する。
1.なぜ、履歴を残すか
まず、作成と更新の履歴を残す理由を説明したいと思う。 例えば、商品tableに商品を入力した際に作成日が分かれば、いつその商品をリリースしたのかが予測がつく。 また、その商品の価格を変更した場合、更新日があれば価格改定日を調べることができる。 他にも、Aというデータ変更とBというデータ変更をほぼ同時に行う必要があった際、時刻を見れば同時に処理されてることが確認できる。 このように、作成日と更新日の記録があれば、いつ何を行ったか確認することができる。
作成日と更新日を残す
2.created_atとupdated_atを設定しない場合
「 created_at」と「updated_at」は、基本的には設定した方がいい。ただし、設定しなくて良いケースもある。 変更が少ないマスタ系のデータベーステーブルだ。(マスタ系とは、最初から値が入っているような基礎となるTableである。 社員名と社員番号を記録した社員情報Tableなどがそれにあたる。) ただし、そんなマスタ系においても、やはり基本的には設定した方が良いと思っている。 例えば、殆ど変更のない社員情報Tableにしても「苗字を変更した」場合はupdateがあると助かるし、 中途社員の場合はcreateがあると、何月頃入社したかが分かる。 あって困ることは無いはずだ。迷ったら付けるようにしよう。
3.MySQLでの設定方法
次にMySQLにおける「created_at」と「updated_at」の設定方法を説明する。 まずは、「CREATE TABLE」で以下のような新しいTable(new_table)を作成する。その際、「created_at」はDEFAULTでCURRENT TIMESTAMPを指定する。 「updated_at」はDEFAULTでCURRENT TIMESTAMP ON UPDATE CURRENT_TIMESTAMPを指定する。 これで、INSERT、UPDATEした際に勝手にこのカラムに日時が入力されるようになる。
MySQLでのcreated_atとupdated_atの設定
例えば、INSERTでnew_tableにデータを2つ入力する。
データの入力(INSERT)
すると、Tableにはこのようにデータがが挿入される。そして、確かに「created_at」と「updated_at」にデータを入れた日時が登録される。
挿入されたデータ
下記のようなSQLで、id=2のデータだけ更新する。
データの更新(UPDATE)
これにより、created_atの日時が更新されていることを確認できた。
データの更新(UPDATE)
4.Djangoにおける設定方法
LaravelとRailsはデフォルトで 「created_at」と「updated_at」が作成される。 しかし、Djangoの場合は自分でカラムを作成する必要がある。そこで、そのやり方を下記に示す。 Modelのclassで、created_atは「DateTimeField」にauto_now_addをTrueにする、updated_atはauto_nowをTrueにする。 これでMySQLに直接SQLで指定した場合と同様のデータベースTableが作成される。
データの更新(UPDATE)
5.まとめ
データベース管理では、データの作成日時と更新日時を追跡するcreated_atとupdated_atフィールドが不可欠だ。 これらはデータの変更履歴を明確にし、データ管理を効率化する。 MySQLでは、これらのフィールドを設定する方法が提供されており、SQLのCREATE TABLEで正しく命令すれば、 データ挿入や更新時に日時が自動的に記録されるようになる。 ぜひ、この機能を活用して、効率的なデータ管理を行おう。
▼参考図書、サイト
マスタテーブルとはいったい何か?そして特徴について知ろう!!
Power BI
MySQLのテーブルにレコード作成時刻や更新時刻を自動で記録する列を作る
Qiita