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

Upsert-Fehler (On Conflict Do Update), der auf doppelte eingeschränkte Werte verweist

Das Problem wird dadurch verursacht, dass anscheinend einige Einträge mehrere Autoren haben. Der innere Join in der von Ihnen geschriebenen Auswahlabfrage gibt also mehrere Zeilen für denselben Eintrag und INSERT ... ON CONFLICT zurück mag das nicht. Da Sie nur den ReferenceAuthor verwenden Tabelle zum Filtern, können Sie einfach die Abfrage so umschreiben, dass sie diese Tabelle verwendet, um nur Einträge zu filtern, die keinen Autor haben, indem Sie einen exists ausführen auf einer korrelierten Unterabfrage. So geht's:

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