sql >> Database >  >> RDS >> PostgreSQL

Problemen met een PostgreSQL upsert-query

De UPDATE in de eerste CTE updated produceert geen rij . Dat betekent dat je geen NULL . krijgt waarde voor updated.id of. Bij deelname aan updated , krijg je niets , dus geen INSERT gebeurt ook niet.

Zou moeten werken met 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]';

Houd er rekening mee dat er nog steeds een zeer kleine kans is op een raceconditie onder zware gelijktijdige belasting. Details onder deze gerelateerde vraag:
Upsert met een transactie




  1. selecteer meerdere rijen in één resultaatrij

  2. PHP / MySQL-fout bij het opvragen van e-mailadres

  3. Log in op bestand via PHP of log in op MySQL-database - wat is sneller?

  4. Berekent het verschil tussen twee datums in PHP