sql >> Database >  >> RDS >> PostgreSQL

Upsert-fout (Bij conflict Do Update) wijst naar dubbele beperkte waarden

Het probleem wordt veroorzaakt door het feit dat sommige inzendingen blijkbaar meerdere auteurs hebben. Dus de inner join in de select-query die je hebt geschreven, retourneert meerdere rijen voor hetzelfde item en INSERT ... ON CONFLICT houdt daar niet van. Aangezien u alleen de ReferenceAuthor . gebruikt tabel om te filteren, kunt u de query eenvoudig herschrijven zodat deze die tabel gebruikt om alleen items te filteren die geen auteur hebben door een exists uit te voeren op een gecorreleerde subquery. Hier is hoe:

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


  1. NULL-waarden voor referential_constraints.unique_constraint_* kolommen in informatieschema

  2. Forceer exacte string MATCH voor PDO voorbereide statements

  3. Dynamische cursor Oracle

  4. Verzamelmethode:LIMIT-functie in Oracle Database