我希望能够知道INSERT
在UPDATE
执行INSERT .. ON CONFLICT
. 也许作为子查询的一部分作为RETURNING
子句的一部分?
大约一个月前似乎有类似的请求,Peter Geoghegan 回应说通过某种黑客攻击可能是可能的。如果有人有任何想法,我现在很想听听。
我希望能够知道INSERT
在UPDATE
执行INSERT .. ON CONFLICT
. 也许作为子查询的一部分作为RETURNING
子句的一部分?
大约一个月前似乎有类似的请求,Peter Geoghegan 回应说通过某种黑客攻击可能是可能的。如果有人有任何想法,我现在很想听听。
我求助于以下伪代码。我在一个plpgsql
函数中,所以我可以使用变量。但我认为我也有可能将其包装成 CTE。
DECLARE var INT;
INSERT .. ON CONFLICT DO NOTHING RETURNING 1 INTO var;
PERFORM ... WHERE var IS NOT NULL;
(如果 INSERT 则 var 为 1,如果更新则为 NULL)UPDATE ...
(我想在步骤 2 中对冲突做些什么)基本上总是执行更新,违背了新 UPSERT 功能的目的,但到目前为止似乎还没有正式的方式。
我正在使用以下方法:
insert into users (created_at, updated_at, email)
values (now(), now(), 'user@example.com')
on conflict (email)
do update set updated_at = now()
returning users.*, (created_at = updated_at) as new_user_created
插入 new_user_created 后为真,更新后为假。我不确定它将如何在首先创建用户然后更新的事务中工作 - 可能 now() 将在每次调用中返回完全相同的值。
将列添加到您的表中以确定。例如.. 'I' 表示插入,'U' 表示要更新使用。
ALTER TABLE foo
ADD COLUMN lastoperation text;
INSERT INTO foo (c1,c2,...,lastoperation)
values (?,?,.... 'I')
ON CONFLICT (<your ndx or keys>)
DO UPDATE SET
lastoperation='U' returning lastoperation;
如果 operation 是 INSERT , lastoperation 的值将是 'I',否则是 'U'。您可以使用 lastoperation 列值..