我试图以某种方式在下面的代码的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)]
答案 0 :(得分:1)
不,使用ON CONFLICT
操作是不可能的。它仅支持:
DO NOTHING
DO UPDATE SET
您可以在documentation中详细了解其语法。
您有2种方法可以解决您的问题:
创建触发器AFTER UPDATE t1
并尝试隔离那些语句
来自这个upsert。它可以从语句中触发
不是这个,但如果你有严格的控制权
在此特定情况下执行并更新仅 t1.v
,
那应该没问题。从触发器开始,您可以执行INSERT。
使用BEGIN .. EXCEPTION .. END的旧方法。 你冒这个风险,并发交易将 - 为 示例 - 删除行,更改行或首先使“检查”无效。它 不是“线程安全”。