gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:49:27 24 4
gpt4 key购买 nike

我定义了一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com