postgresql - 如何抵消 'insert ... on conflict' 更新时调用两次的触发前?

标签 postgresql

我定义了一个 BEFORE-trigger 来做几件事:

  1. 通过添加一些计算数据来调整要保存的当前行
  2. 有条件地将一些更改写入不同的表。

虽然我知道在 AFTER 触发器而不是 BEFORE 触发器中有条件地将一些更改写入不同的表是惯用的,但似乎几乎不可能提取逻辑1. 和 2.

鉴于此,我遇到了一些问题:

我正在执行 insert on conflict,这会导致行更新触发 BEFORE 触发器两次:一次用于插入,一次用于更新。 (即:PG 正确地引发了一个“id 已经存在的异常”,但这发生在执行前触发之后)

这导致BEFORE-trigger中的一些逻辑,比如写变化,两次明显是错误的。

如何解决这个问题?

虽然不是很优雅,但我可以想象当一个已经存在的行以状态 TG_OP = 'INSERT' 进入触发器时,在 BEFORE 触发器中手动抛出一个“id 已经存在”的异常。这将使第一个触发器短路,让 PG 处理其余的事情:引发冲突,导致更新发生。

但是,我无法让它工作。是否有可能手动引发异常,这是由“insert.. on conflict”拾取的?

还有其他选择吗?

最佳答案

也许您可以在第二个表上引入唯一约束,以检测何时输入相同的数据两次。然后您可以在第二个表上使用 INSERT ... ON CONFLICT ... DO NOTHING

关于postgresql - 如何抵消 'insert ... on conflict' 更新时调用两次的触发前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44180780/

相关文章:

linux - 更改为nologin后无法启动postgres

sql - 运行按一个字段分组并按另一个字段排序的 Postgres 查询

json - PostgreSQL 查询/JSON

postgresql - Postgres : The best way to optmize "greater than" query

sql - 具有明确顺序的顺序子句

java - 如何在 hibernate 状态下规范化数据库? (重复值不会一次又一次保存)

sql - PostgreSQL WHERE 子句如何在此查询中工作?

ruby-on-rails - 添加带有 Rails 迁移错误的整数数组列

sql - 使用postgres中的nth_value窗口函数从大表中获取图形数据

sql - 更新 Postgres 的竞争条件(读取已提交)