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 に答える