PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Errore di upsert (On Conflict Do Update) che punta a valori vincolati duplicati

Il problema è causato dal fatto che apparentemente alcune voci hanno più autori. Quindi il join interno nella query di selezione che hai scritto restituirà più righe per la stessa voce e INSERT ... ON CONFLICT non gli piace. Dal momento che usi solo il ReferenceAuthor tabella per il filtraggio, puoi semplicemente riscrivere la query in modo che utilizzi quella tabella per filtrare solo le voci che non hanno alcun autore eseguendo un exists su una sottoquery correlata. Ecco come:

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