PostgreSQL UPSERT触发器返回id

时间:2012-05-04 18:47:15

标签: function postgresql triggers plpgsql upsert

我在表上有UPSERT触发器,可以在执行插入操作时更新而不是插入。我在该表和returning id上执行插入功能但是在更新而不是插入时它不返回id。我希望在两种情况下都能获得id。

触发代码

perform 1 from tera_subject 
where id = new.subject_id and owner = new.user_id;

if found then
   return null;
else
   select id into vote_id from tera_votes where 
  user_id = new.user_id and
  subject_id = new.subject_id;
   if not found then
  return new;
   else
      -- raise notice 'vote_id: % ; vote: %',vote_id,new.vote;
      if(tg_op = 'INSERT') then
          begin
          -- raise notice 'redirecting to update';
          update tera_votes
              set vote=new.vote
              WHERE id = vote_id;
          end;
      elsif(tg_op = 'UPDATE') then
          -- raise notice 'in update';
          return new;
      end if;
      -- raise notice 'end of trigger %',tg_op;
      return null;
   end if;
end if;
end;

1 个答案:

答案 0 :(得分:2)

我认为你不会被触发器“返回”任何东西。

你在里面做的是:

  • 根据您的条件运行更新;
  • 取消触发触发器的INSERT语句。

这意味着,INSERT以一种简单的方式终止(毫无例外),但这也意味着无法向您提供任何细节,因为触发器函数不会返回任何值。

如果您需要拥有UPSERT编辑项目的ID,请考虑使用始终为您返回ID的功能,例如this one