|
|
PostgreSQL 更新日時の自動記録 |
H.Kamifuji |
更新日時の自動記録について、MySQL では、CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );とカラムの属性として、簡単に指定できる。 PostgreSQL では、同様な指定ができないので、若干の工夫が必要になる。ここでは、TRIGGER FUNCTION を利用して実現する方法について解説します。 |
PostgreSQL で、更新日時の自動記録するには、下記のような TRIGGER FUNCTION を指定する方法で実現できる。![]() 8 行と 9 行には、生成日時( create_date ) と更新日時( last_update ) を記録するカラムを指定します。これで、生成時には、両方に生成日時が保存されます。 8 create_date timestamp default current_timestamp, 9 last_update timestamp default current_timestamp13 行は、FUNCTION で、使用する language がないと言われたときには、追加しておいて下さい。 13 CREATE LANGUAGE plpgsql ;15 ~ 21 行は、FUNCTION の設定です。 15 行の update_modified_column() は、FUNCTION 名です。24 行の EXECUTE PROCEDURE と同じにする。 18 行の last_update は、更新日時を保存するカラムを指定して下さい。 15 CREATE OR REPLACE FUNCTION update_modified_column() 16 RETURNS TRIGGER AS $$ 17 BEGIN 18 NEW.last_update = now(); 19 RETURN NEW; 20 END; 21 $$ language plpgsql ;23 ~24 行は、TRIGGER 設定です。 23 行の users は、TRIGGER を適用する TABLE 名を指定する。 24 行の update_modified_column() は、実行するFUNCTION 名を指定する。 23 CREATE TRIGGER update_users BEFORE UPDATE ON users 24 FOR EACH ROW EXECUTE PROCEDURE update_modified_column();27 ~ 29 行で、lastname を 3 件 insert しています。 上記の SQL を実行してみました。下記のようにエラーなく実行できた。 ![]() 下記は、作成された TABLE の確認と update 後に last_update が正常に記録されていることの確認を行っています。 ![]() 5 ~ 17 行では、作成された TABLE の構成を表示しています。17 行では、TRIGGER 関数が登録されていることが表示されています。 19 ~ 25 行では、作成直後の DB を見ています。create_date と last_update の両カラムとも生成時の日時が記録されています。 27 ~ 55 行では、firstname を update して、last_update が自動更新されていることを確認しています。 |