如果行已更新,则更新列值的函数

jul*_*iam 4 postgresql trigger

我正在尝试创建一个函数,如果我更新数据库行的任何列,它将增加我的版本列值 (int)。例如,如果我有一个包含列(id、标题、版本)并且默认版本为 1 的 foo 表,我希望我的 vesrion 在我更新单个 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;
Run Code Online (Sandbox Code Playgroud)

我对这个功能的触发器:

create trigger update_version 
after update on foo
for each row execute procedure update_foo_version();
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 5

很难判断错误消息哪里出了问题,但我会推测两件事。你想要一个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();
Run Code Online (Sandbox Code Playgroud)