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演示