PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Erro de Upsert (On Conflict Do Update) apontando para valores restritos duplicados


O problema é causado pelo fato de que aparentemente algumas entradas têm vários autores. Portanto, a junção interna na consulta de seleção que você escreveu retornará várias linhas para a mesma entrada e INSERT ... ON CONFLICT não gosta disso. Como você só usa o ReferenceAuthor tabela para filtragem, você pode simplesmente reescrever a consulta para que ela use essa tabela para filtrar apenas as entradas que não têm nenhum autor fazendo um exists em uma subconsulta correlacionada. Veja como:
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)
;