在postgres中,我在分区表上有一个插入后触发器,用于检查记录是否唯一。当前,如果记录不是唯一的,触发器将引发异常。这不是我想要的,因为我只想忽略这种情况,就好像插入实际上发生了一样。
是否可以将触发器配置为静默失败?周围的事务不应失败,但不应插入该行。
我在分区表上有一个插入后触发器,用于检查记录是否唯一。
您可以使用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)