PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Probleme mit einer PostgreSQL-Upsert-Abfrage

Das UPDATE im ersten CTE updated erzeugt keine Zeile . Das heißt, Sie erhalten kein NULL Wert für updated.id entweder. Beim Beitritt zu updated , erhalten Sie nichts , also kein INSERT passiert auch nicht.

Sollte mit NOT EXISTS funktionieren :

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]';

Seien Sie sich bewusst, dass es immer noch eine sehr kleine Chance für eine Race Condition gibt unter starker gleichzeitiger Belastung. Details unter dieser verwandten Frage:
Upsert mit einer Transaktion