sql - 你能防止在 pgsql 的后触发器中插入吗?
问题描述
在 postgres 中,我在分区表上有一个插入后触发器,用于检查记录是否唯一。目前,如果记录不是唯一的,触发器会引发异常。这不是我想要的,因为我只想忽略这种情况并表现得好像插入确实发生了。
是否可以将触发器配置为静默失败?周围的事务不应失败,但不应插入行。
解决方案
我在分区表上有一个插入后触发器,用于检查记录是否唯一。
您可以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)
推荐阅读
- haskell - haskell 中的 const 函数声明
- sql - SQL Server:如何根据 [Batch Line Start] 错误找到特定的失败代码行
- python - 如何将表示时间的字符串转换为 Python 中的数字?有什么内置功能吗?
- android - 如何让 Android 11 测试应用程序编译
- jenkins-pipeline - 无法播种具有 BbS SCM 步骤的管道作业
- mongodb - MongoDB 聚合:在 $match $or 查询中使用当前文档的字段值
- javascript - 使用相同的 Javascript 函数将多个项目添加到数组
- replication - 复制与冗余
- java - 解决/处理列表的最佳方式
>> 在 Java 8 中 - python-3.6 - VS代码python调试器忽略断点