sql >> Databáze >  >> RDS >> PostgreSQL

Problémy s postgreSQL upsert dotazem

UPDATE v prvním CTE updated nevytváří žádný řádek . To znamená, že nedostanete NULL hodnotu pro updated.id buď. Při připojování k updated , nedostanete nic , takže žádné INSERT stane se také.

Mělo by fungovat s 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]';

Uvědomte si, že stále existuje velmi malá šance na závodní stav při velkém souběžném zatížení. Podrobnosti v této související otázce:
Upsert s transakcí




  1. SQL určit minimální sekvenční dny přístupu?

  2. Jak opravit zastaralé oracle.sql.ArrayDescriptor, oracle.sql.STRUCT a oracle.sql.StructDescriptor

  3. mysql dotaz - problém vložení dat unix_timestamp (nyní ( ) ).

  4. Rozdíl ve výkonu nativního SQL (pomocí MySQL) oproti použití Hibernate ORM?