你能阻止在 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)
在 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)