web-dev-qa-db-ja.com

行が更新された場合に列値を更新する関数

データベース行の列を更新すると、バージョン列の値(int)をインクリメントする関数を作成しようとしています。たとえば、列(id、title、version)を持つfooテーブルがあり、デフォルトのバージョンが1の場合、単一のfoo行のタイトルを更新したら、バージョンをインクリメントします。次の関数を記述しましたが、テストするとエラーが発生します。

create or replace function update_foo_version()
returns trigger as $body$
  begin
    update foo
    set version = version::int + 1
    where old.id=new.id;
    return new;
  end
$body$
language plpgsql;

この関数のトリガー:

create trigger update_version 
after update on foo
for each row execute procedure update_foo_version();
4
juliam

エラーメッセージのどこに問題があるのか​​を判断するのは困難ですが、2つのことを推測します。 BEFOREトリガーが必要ですが、これは機能しません:where old.id=new.id;

あなたが欲しいのは

create or replace function update_foo_version()
returns trigger as $body$
  begin
    new.version = old.version + 1;
    return new;
  end
$body$
language plpgsql;

create trigger update_version 
BEFORE update on foo
for each row execute procedure update_foo_version();
5
Evan Carroll