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

Chyba Upsert (On Conflict Do Update) ukazující na duplicitní omezené hodnoty

Problém je způsoben tím, že zřejmě některé záznamy mají více autorů. Takže vnitřní spojení ve výběrovém dotazu, který jste napsali, vrátí více řádků pro stejnou položku a INSERT ... ON CONFLICT to nemá rád. Protože používáte pouze ReferenceAuthor tabulku pro filtrování, můžete jednoduše přepsat dotaz tak, aby používal tuto tabulku pouze k filtrování položek, které nemají žádného autora, a to provedením exists na korelovaný poddotaz. Zde je postup:

INSERT INTO new.bookmonographs  (citavi_id, abstract, createdon, edition, title, year)
SELECT "ID", "Abstract", "CreatedOn"::timestamp, "Edition", "Title", "Year"
FROM old."Reference"
WHERE old."Reference"."ReferenceType" = 'Book'
    AND old."Reference"."Year" IS NOT NULL
    AND old."Reference"."Title" IS NOT NULL
    AND exists(SELECT FROM old."ReferenceAuthor" WHERE old."ReferenceAuthor"."ReferenceID" = old."Reference"."ID")
    --Year, Title and Author must be present in the data, otherwise the entry is deemed useless, hence won't be included
ON CONFLICT (citavi_id) DO UPDATE 
    SET (abstract, createdon, edition, title, year) = (excluded.abstract, excluded.createdon, excluded.edition, excluded.title, excluded.year)
; 


  1. Učení SELECT FROM WHERE připravené příkazy

  2. Šifrovat heslo v příkazu insert v postgresql vyvolá chybu (Je třeba přidat explicitní typ přetypování)

  3. Laravel:získání jedné hodnoty z dotazu MySQL

  4. Jak aktualizovat 3 sloupce tabulek, zatímco na stránce je viditelný pouze jeden sloupec