A
UPDATE
no primeiro CTE updated
produz nenhuma linha . Isso significa que você não recebe um NULL
valor para updated.id
qualquer. Ao ingressar em updated
, você não recebe nada , então não há INSERT
também acontece. Deve funcionar com
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 '[email protected]'
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 '[email protected]';
Esteja ciente de que ainda há uma chance muito pequena de uma condição de corrida sob carga concorrente pesada. Detalhes nesta pergunta relacionada:
Upsert with a transaction