Postgres 9.5でUPSERTを実行しているときに、INSERTが成功したときにnullを返し、CONFLICTで何かを返すことは可能ですか?
私はこのようなことをしたいと思います:
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以外のもの)を返すことです。これはONCONFLICT DO UPDATEで実行できることは知っていますが、ディスクへの書き込みが必要になります。
CTEを使用できます。
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加