PostgreSQLで行が更新されたときにタイムスタンプを更新する


87

MySQLでは、これを実行してchangetimestamp、行が変更されるたびに列を更新できます。

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

PostgreSQLで上記と同様のことはありますか?


:あなたが引き金必要PostgreSQLの私の知る限りのように簡単ではありません pointbeing.net/weblog/2008/03/...
mechanical_meat

2
MySQLには、timestampバージョンと設定に応じて、列に対していくつかの「特別な処理」がありますが、(幸いなことに!)Postgresでは再現できません。特定のコンステレーションでの入力時に0timestamp列を許可したりNULL、現在のタイムスタンプに変換したりするようなものです。MySQLPostgresの微妙な違いに注意するために、両方のRDBMSのマニュアルを必ず調べてください。
Erwin Brandstetter 2014年

1
@ErwinBrandstetterは、2018年のタイムスタンプを自動更新するためのベストプラクティスである以下の回答ですか?
CommonSenseCode 2018

回答:


127

次のように、テーブルのchangetimestamp列を更新する関数を作成します。

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

次のように更新が発生するたびにupdate_changetimestamp_column()関数を呼び出すトリガーをテーブルに作成します。

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();

2
だから、トリガーを介する以外に私がやりたいことをする他の方法はありませんか?おそらく300以上のすべてのテーブルに「更新時のタイムスタンプ」を実装したいからです。また、トリガーを作成すると、パフォーマンスの問題が発生する可能性があると考えています。
bichonfrise74 2009年

5
私の知る限り、これはpostgresqlでこれを行うための標準的な方法です。mysqlで「onupdatecurrent_timestamp」と書くと、バックグラウンドでテーブルにトリガーが作成されます。違いは、トリガーを作成するのではなく、手動でここに作成することです。
Charles Ma

3
少なくとも賢明なデータベースでは、パフォーマンスの低下は事実上ありません。

5
関数のパラメーターとして更新する必要がある列名を指定する方法はありますupdate_changetimestamp_columnか?
Antoan Milkov 2014

7
@wombleこの例を投稿すると非常に便利です。更新する列を動的に指定する方法を管理している場合は、それを回答として記述します。
MirroredFate 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.