6

触发器和约束的执行顺序是什么?例如,如果我插入了一个错误的外键,pgsql 会在我自己的触发器(之前或之后)之前检测到这个 fk 吗?

我知道触发器内的异常将回滚在同一触发器内执行的任何更新/插入(即使对于 AFTER 触发器),但对于约束是否相同?外键约束是否会从我自己的触发器回滚我的所有插入/更新?

谢谢你

4

2 回答 2

5

我认为Postgres 文档对此非常清楚(我对相关部分的突出显示):

可以指定触发器在对行尝试操作之前触发(在检查约束并尝试 INSERT、UPDATE 或 DELETE 之前);或者在操作完成之后(在检查约束并且 INSERT、UPDATE 或 DELETE 完成之后);或代替操作(在视图上插入、更新或删除的情况下)。如果触发器在事件之前或代替事件触发,则触发器可以跳过当前行的操作,或更改正在插入的行(仅适用于 INSERT 和 UPDATE 操作)。如果触发器在事件之后触发,则所有更改,包括其他触发器的效果,对触发器都是“可见的”。

因此,“之前”或“代替”触发器不会首先执行约束。

于 2014-06-28T17:07:40.203 回答
1

如果在触发器之后,则先执行约束,然后执行触发器。

如果在触发器之前,则先执行触发器,然后在执行约束之后。

于 2016-10-05T02:03:02.547 回答