2017-09-04 51 views
0

我想以某种方式在下面的代码的ON CONFLICT(行#5)中执行额外的语句。可能吗?ON冲突中的多个操作...?

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

不,不可能使用ON CONFLICT操作。它只有那些支持:

DO NOTHING 
DO UPDATE SET 

你可以阅读更多关于它在documentation语法。

您有解决您的问题2层的替代品:

  1. 创建触发器AFTER UPDATE t1并尝试找出语句 来自这个UPSERT。它可以从 不是这个upsert的语句中触发,但是如果您严格控制 执行什么和更新只有t1.v发生在这个特定的情况下,那么它应该是OK。从触发器你可以做你的INSERT。

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