你能阻止在 pgsql 中的 after 触发器中插入吗?

Can you prevent an insert in an after trigger in pgsql?

在 postgres 中,我在分区 table 上有一个插入后触发器,用于检查记录是否唯一。 目前,如果记录不是唯一的,触发器会引发异常。 这不是我想要的,因为我只想忽略这种情况并表现得好像插入确实发生了。

是否可以将触发器配置为静默失败? 周围的事务不应该失败,但是行不应该被插入。

I have an after-insert trigger on a partitionned table that checks if the record is unique or not.

您可以使用 on conflict do nothing 子句将此作为 insert 语句的一部分。这比使用触发器更简单、更有效。

为此,您需要对要强制执行其唯一性的列(或列的元组)进行 unique 约束。假设这是列 id,您将执行:

insert into mytable(id, ...)    -- enumerate the target columns here
values(id, ...)                 -- enumerate the values to insert here
on conflict(id) do nothing

请注意,冲突操作 do nothing 实际上并不需要指定冲突目标,因此严格来说,您可以将其写为 on conflict do nothing。我发现指定冲突目标总是一个好主意,这样范围就更好定义了。


如果由于某种原因,您不能在目标列上有唯一索引,那么另一种选择是使用 insert ... select 语法和 not exists 条件:

insert into mytable(id, ...)
select id, ...
from (values(id, ...)) t(id, ...)
where not exists (select 1 from mytable t1 where t1.id = t.id)