关于sql:Postgres 9.5 ON CONFLICT DO SELECT

Postgres 9.5 ON CONFLICT DO SELECT

在Postgres 9.5中进行UPSERT时,是否可以在INSERT成功时返回null并返回ON CONFLICT?

我想这样的事情:

1
2
3
4
INSERT INTO"user" (TIMESTAMP, user_id, member_id)
VALUES ($1, $2, $3)
ON CONFLICT (user_id, member_id)
DO SELECT id FROM"user" WHERE user_id = $2 returning user_id

选择user_id的唯一目的是在CONFLICT上返回一些东西(除null之外的任何东西),而不写入磁盘。 我知道这可以通过ON CONFLICT DO UPDATE来完成,但它会涉及写入磁盘。


你可以使用CTE:

1
2
3
4
5
6
7
8
9
10
11
12
13
WITH cte AS (
   INSERT INTO"user"(TIMESTAMP, user_id, member_id)
   VALUES ($1, $2, $3)
   ON CONFLICT (user_id, member_id) DO NOTHING
   RETURNING user_id
)
SELECT NULL AS RESULT
WHERE EXISTS (SELECT 1 FROM cte)          -- success
UNION ALL
SELECT id
FROM"user"
WHERE user_id = $2
  AND NOT EXISTS (SELECT 1 FROM cte);     -- conflict

DBFiddle演示