2012-05-04 57 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'附近給我的語法錯誤' –