UPDATE 最初のCTEでupdated 行なしを生成します 。つまり、NULLは取得されません。 updated.idの値 また。 updatedに参加する場合 、何も得られない 、したがってINSERTはありません どちらかが起こります。
NOT EXISTSで動作するはずです :
WITH updated AS (
UPDATE vote_user_table v
SET positive = TRUE -- use booleann values ..
,negative = FALSE -- .. instead of quoted string literals
FROM usuario u
WHERE v.review_id = 6 -- guessing origin
AND v.user_id = u.id
AND u.username ILIKE 'example@sqldat.com'
RETURNING v.id
)
INSERT INTO vote_user_table (review_id, user_id, positive, negative)
SELECT 6, u.id, TRUE, FALSE
FROM usuario u
WHERE NOT EXISTS (SELECT 1 FROM updated)
AND u.username ILIKE 'example@sqldat.com';
競合状態の可能性はまだごくわずかであることに注意してください。 同時負荷が大きい場合。この関連する質問の詳細:
トランザクションでアップサート>