sql >> Base de Datos >  >> RDS >> PostgreSQL

Error Upsert (On Conflict Do Update) que apunta a valores restringidos duplicados

El problema se debe al hecho de que, aparentemente, algunas entradas tienen varios autores. Entonces, la unión interna en la consulta de selección que escribió devolverá varias filas para la misma entrada y INSERT ... ON CONFLICT no le gusta eso Dado que solo usa el ReferenceAuthor para filtrar, simplemente puede reescribir la consulta para que use esa tabla para filtrar solo las entradas que no tienen ningún autor haciendo un exists en una subconsulta correlacionada. Así es 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)
;