我有一个INSERT
Postgres 9.5+ 中的语句,但由于关键冲突,INSERT 有时实际上不会发生(我已经设置ON CONFLICT DO NOTHING
在插入)。
If the INSERT
发生了,那么触发器当然会运行。但如果INSERT
由于关键冲突而不会发生,触发器是否仍会运行?
这取决于它是否是BEFORE
or AFTER
扳机?
Per-row BEFORE INSERT
在检查冲突之前,会触发触发器,并应用对建议行的可能影响。手册: https://www.postgresql.org/docs/current/sql-insert.html#SQL-ON-CONFLICT
请注意,所有每行的效果BEFORE INSERT
触发器是
反映在排除值中,因为这些影响可能有助于
到从插入中排除的行。
A plain INSERT
会提出一个EXCEPTION
由于独特的违规,并且会回滚所有内容(除了无法回滚的内容,例如递增序列)。
但是 UPSERT 与ON CONFLICT DO NOTHING
抑制异常,因此即使跳过建议插入的行,任何此类触发器的影响仍然存在。
(因此,当使用ON CONFLICT DO UPDATE ...
,此类触发器的效果反映在特殊的EXCLUDED
中可见的行UPDATE
part.)
But AFTER INSERT
这两种情况都不会触发触发器。该行从未真正插入 - 无论是否引发异常。
我想用一个RULE https://www.postgresql.org/docs/current/sql-createrule.html相反,它可以重写INSERT
运行附加命令,与结果无关。比触发器更棘手,但它会起作用before the INSERT
可能会被取消。However, 手册警告: https://www.postgresql.org/docs/current/sql-createrule.html
请注意,INSERT
含有一个ON CONFLICT
子句不能用于
有的表INSERT
or UPDATE
规则。考虑使用
相反,可更新视图。
所以,没有骰子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)