ON CONFLICT DO ...中的多个操作?

时间:2017-09-04 16:25:10

标签: postgresql

我试图以某种方式在下面的代码的ON CONFLICT(第5行)中执行另外的声明。有可能吗?

INSERT INTO t1 (a, v)
SELECT a, v FROM t2
ON CONFLICT (a) DO 
   UPDATE SET t1.v = t1.v + EXCLUDED.v
  [INSERT INTO t3 (a, v) VALUES(a, EXCLUDED.v)]

1 个答案:

答案 0 :(得分:1)

不,使用ON CONFLICT操作是不可能的。它仅支持:

DO NOTHING
DO UPDATE SET

您可以在documentation中详细了解其语法。

您有2种方法可以解决您的问题:

  1. 创建触发器AFTER UPDATE t1并尝试隔离那些语句 来自这个upsert。它可以从语句中触发 不是这个,但如果你有严格的控制权 在此特定情况下执行并更新 t1.v, 那应该没问题。从触发器开始,您可以执行INSERT。

  2. 使用BEGIN .. EXCEPTION .. END的旧方法。 你冒这个风险,并发交易将 - 为 示例 - 删除行,更改行或首先使“检查”无效。它 不是“线程安全”。