新しいレコードにだけ追加日時をデフォルトで登録するタイムスタンプ型カラムを追加する方法

こんにちは、さるまりんです。

こんなケースがあってちょっと、ん?と考えたのでそれについて残しておきます。

データベース上に作られたテーブルがあります。このテーブルにはすでにデータが格納されています。
テーブルが作成時にはレコードの作成日時を格納すカラムを用意しておらず、必要となり後から追加することになりました。

次のALTER TABLE文で作成日時のカラムcreatedを追加することができます。
デフォルト値はレコード追加日時(現在日時)です。
INSERTした日時ですね。

ALTER TABLE my_table ADD COLUMN created TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

ここで問題発生。

これまでのデータはどうしよう。。。

↑を実行し、SELECTでデータを見てみると、これまでのレコードのcreatedとして変更された時点の日時が返却されてきました。

もちろんそのデータが作られた日時は分からないので正しいデータを入れることはできない。
なので、せめてそれらについてはnullにして、以降追加されるレコードには追加された日時を設定するようにしたいと思います。

これを実現するにはALTER TABLEを2段階にします。

1. まずはデフォルト値をnullでカラムを追加します。

ALTER TABLE my_table ADD COLUMN created TIMESTAMP;

この段階でここまでのレコードのcreatednullとなります。

2. 次に追加したカラムのデフォルト値をCURRENT_TIMESTAMP(現在日時)に変更します。

ALTER TABLE my_table ALTER COLUMN created SET DEFAULT CURRENT_TIMESTAMP;

これで以降はレコードが追加された日時がcreatedに登録されます。

テーブル作成の段階で作成日時、更新日時を持つべきかどうかは場合によると思います。
運用しながらあれ?やっぱり必要だ!という時に、こんな感じで追加する一つのアイデアでした。

読んでくださってありがとうございました。

それではまた!