2

我希望能够知道INSERTUPDATE执行INSERT .. ON CONFLICT. 也许作为子查询的一部分作为RETURNING子句的一部分?

大约一个月前似乎有类似的请求,Peter Geoghegan 回应说通过某种黑客攻击可能是可能的。如果有人有任何想法,我现在很想听听。

4

3 回答 3

1

我求助于以下伪代码。我在一个plpgsql函数中,所以我可以使用变量。但我认为我也有可能将其包装成 CTE。

  1. DECLARE var INT;
  2. INSERT .. ON CONFLICT DO NOTHING RETURNING 1 INTO var;
  3. PERFORM ... WHERE var IS NOT NULL;(如果 INSERT 则 var 为 1,如果更新则为 NULL)
  4. UPDATE ...(我想在步骤 2 中对冲突做些什么)

基本上总是执行更新,违背了新 UPSERT 功能的目的,但到目前为止似乎还没有正式的方式。

于 2016-03-03T14:26:16.313 回答
1

我正在使用以下方法:

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() 将在每次调用中返回完全相同的值。

于 2018-07-03T07:27:47.770 回答
1

将列添加到您的表中以确定。例如.. '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 列值..

于 2019-07-12T17:22:41.643 回答