PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Erreur Upsert (On Conflict Do Update) pointant vers des valeurs contraintes en double

Le problème est causé par le fait qu'apparemment certaines entrées ont plusieurs auteurs. Ainsi, la jointure interne dans la requête de sélection que vous avez écrite renverra plusieurs lignes pour la même entrée et INSERT ... ON CONFLICT n'aime pas ça. Puisque vous n'utilisez que le ReferenceAuthor table pour le filtrage, vous pouvez simplement réécrire la requête afin qu'elle utilise cette table pour filtrer uniquement les entrées qui n'ont pas d'auteur en faisant un exists sur une sous-requête corrélée. Voici comment :

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)
;