1

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;
4

1 回答 1

3

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

你在里面做的是:

  • 根据您的情况运行更新;
  • 抑制INSERT触发触发器的语句。

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

如果您需要获得 UPSERT 项目的 ID,请考虑使用始终返回 ID 的函数,例如这个

于 2012-05-04T19:28:34.950 回答