簡體   English   中英

Postgres INSERT觸發“ ON CONFLICT DO NOTHING”

[英]Postgres INSERT triggers with 'ON CONFLICT DO NOTHING'

我在Postgres 9.5+中有一個INSERT語句,但是有時由於鍵沖突而實際上並沒有發生INSERT(我在INSERT上設置了ON CONFLICT DO NOTHING )。

如果發生INSERT,則觸發器當然會運行。 但是,如果由於鍵沖突而沒有發生INSERT,觸發器是否仍將運行?

它是否取決於觸發BEFORE還是AFTER

對於AFTER觸發器,還有更多“機會”可以取消INSERT (與其他觸發器一起使用),從而觸發觸發器。 但是這個問題似乎並不取決於BEFOREAFTER 如果在UPSERT命令中跳過了該行( INSERT ... ON CONFLICT DO NOTHING ),則觸發任何ON INSERT觸發器之前 ,將跳過該行。

您必須檢查INSERT的成功並根據結果采取行動-就像我們在您的另一個問題下討論的那樣:

您在那里找到了解決問題的方法。 如果觸發器中的命令不依賴於插入的行,則可以只使用帶有多個單獨命令的事務-或為了方便將其包裝在函數中。

如果觸發器中的命令取決於插入的行,則無論哪種情況,您都希望返回所涉及的行。 那么您就擁有INSERT或SELECT的經典案例...

...,然后在其他命令中使用結果。 您可以將其與修改數據的CTE鏈接起來:


我想到了改用RULE ,它可以重寫INSERT來運行其他命令,而與結果無關。 比觸發器更棘手,但是它可以在取消INSERT 之前啟動。 但是手冊警告:

請注意,包含ON CONFLICT子句的INSERT不能用於具有INSERTUPDATE規則的表。 考慮改用可更新的視圖。

所以,沒有骰子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM