首页 > 解决方案 > 你能防止在 pgsql 的后触发器中插入吗?

问题描述

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

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

标签: sqlpostgresqlsql-insertdatabase-trigger

解决方案


我在分区表上有一个插入后触发器,用于检查记录是否唯一。

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

为此,您需要unique对要强制执行其唯一性的列(或列的元组)进行约束。假设这是 column 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)

推荐阅读