[英]Equivalent of ON CONFLICT DO NOTHING for UPDATE postgres
[英]Postgres INSERT triggers with 'ON CONFLICT DO NOTHING'
我在Postgres 9.5+中有一個INSERT
語句,但是有時由於鍵沖突而實際上並沒有發生INSERT(我在INSERT上設置了ON CONFLICT DO NOTHING
)。
如果發生INSERT,則觸發器當然會運行。 但是,如果由於鍵沖突而沒有發生INSERT,觸發器是否仍將運行?
它是否取決於觸發BEFORE
還是AFTER
?
對於AFTER
觸發器,還有更多“機會”可以取消INSERT
(與其他觸發器一起使用),從而不觸發觸發器。 但是這個問題似乎並不取決於BEFORE
或AFTER
。 如果在UPSERT命令中跳過了該行( INSERT ... ON CONFLICT DO NOTHING
),則在觸發任何ON INSERT
觸發器之前 ,將跳過該行。
您必須檢查INSERT
的成功並根據結果采取行動-就像我們在您的另一個問題下討論的那樣:
您在那里找到了解決問題的方法。 如果觸發器中的命令不依賴於插入的行,則可以只使用帶有多個單獨命令的事務-或為了方便將其包裝在函數中。
如果觸發器中的命令取決於插入的行,則無論哪種情況,您都希望返回所涉及的行。 那么您就擁有INSERT或SELECT的經典案例...
...,然后在其他命令中使用結果。 您可以將其與修改數據的CTE鏈接起來:
我想到了改用RULE
,它可以重寫INSERT
來運行其他命令,而與結果無關。 比觸發器更棘手,但是它可以在取消INSERT
之前啟動。 但是 , 手冊警告:
請注意,包含
ON CONFLICT
子句的INSERT
不能用於具有INSERT
或UPDATE
規則的表。 考慮改用可更新的視圖。
所以,沒有骰子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.