触发器和约束的执行顺序是什么? 例如,如果我插入了一个错误的外键,那么在我自己的触发器(BEFORE或AFTER)之前,这个fk会被pgsql检测到吗?
我知道触发器内部的异常将回滚在同一触发器内执行的任何更新/插入(即使对于AFTER触发器)但是对于约束它是否相同?外键约束是否会从我自己的触发器中回滚所有插入/更新?
谢谢
答案 0 :(得分:3)
我认为Postgres documentation非常明确(我对相关部分的重点):
可以指定触发器在尝试操作之前触发 连续(检查约束之前和INSERT,UPDATE或。) 尝试DELETE);或在手术完成后(之后 检查约束,INSERT,UPDATE或DELETE具有 完成);或者代替操作(在插入的情况下, 更新或删除视图)。如果触发器在之前或之后触发 对于该事件,触发器可以跳过当前行的操作, 或更改正在插入的行(用于INSERT和UPDATE操作 只要)。如果触发器在事件发生后触发,则包括所有更改 其他触发器的效果对触发器是“可见的”。
因此,“before”或“而不是”触发器不会先执行约束。
答案 1 :(得分:1)
如果在触发后再执行约束,则执行触发。
如果在触发之前,则先执行触发,然后执行约束。