2012-05-04 3 views
0

삽입 작업을 수행하는 동안 삽입하는 대신 업데이트 할 수있는 테이블에 UPSERT 트리거가 있습니다. 해당 테이블에 삽입 기능을했습니다 및 returning id 그러나 삽입 대신 업데이트 할 때 ID를 반환하지 않습니다. 두 경우 모두에서 이드를 얻고 싶습니다.PostgreSQL UPSERT 트리거 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

트리거 코드로 업데이트되었습니다. 함수는'RETURNING id '를 가진 INSERT 질의 일 뿐이다. –

+0

'DESCRIBE' 섹션이 빠져있다. – vyegorov

답변

2

는 트리거에 의해 "반환".

당신이 내하고있는 것은 : 당신의 조건에 따라 업데이 트를 실행

  • ;
  • 트리거를 실행 한 INSERT 문을 표시하지 않습니다.

즉, INSERT은 쉬운 방법으로 종료되지만 예외 함수가 아무 값도 반환하지 않으므로 아무런 세부 정보도 제공 할 수 없음을 의미합니다.

UPSERT 항목의 ID가 필요한 경우 this one과 같이 항상 ID를 반환하는 기능을 사용해보십시오.

+0

내가 이해할 수없는 것은 그 함수에서'LOOP'가 거기서 무엇을하고 있는가? 그것은 무엇을 반복 하는가? –

+0

그런 루프가 필요하지 않습니다. 이 기능의 일반적인 개념은 사용자의 요구에 맞습니다. 이 루프는 병렬 세션이'UPDATE'가 행을 찾지 못하고 일치하는 행을 INSERT하기 전에 그 INSERT 문 바로 앞에 INSERT를하기 전에 예외가 발생했을 때 예외가 발생하면 명령문을 다시 발행해야합니다. – vyegorov

+0

어쨌든 나는 루프를 유지하고있다. 그러나 http://pastebin.com/mVQHEiye가 나를 돌보고있다. LOOP' 근처의 문법 오류 –