[英]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.