2012-05-04 35 views
0

我有一个UPSERT触发器可能会更新,而不是在插入操作时插入。我已经在该表上插入了函数,并且returning id但是它在更新而不是插入时不会返回一个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-ed项目的ID,请考虑使用一个会始终返回您的ID的函数,如this one

+0

我不明白的是'LOOP'在那个函数中做了什么?它迭代什么? –

+0

你不需要这样的循环。该功能的总体思路适合您的需求。该循环需要在case语句失败时重新发出语句,而在并行会话在'UPDATE'未找到行之后并且恰好在该函数的INSERT之前设置了INSERT匹配行时,该语句失败。 – vyegorov

+0

无论如何,我已经保持循环但http://pastebin.com/mVQHEiye是''LOOP'附近给我的语法错误' –