可以防止在pgsql中的after触发器中插入吗?

问题描述 投票:0回答:1

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

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

postgresql triggers transactions sql-insert
1个回答
0
投票

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

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

为此,您需要在要强制其唯一性的列(或列的元组)上使用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)
© www.soinside.com 2019 - 2024. All rights reserved.