繁体   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