sql >> Databasteknik >  >> RDS >> PostgreSQL

Upsert-fel (On Conflict Do Update) som pekar på dubbletter av begränsade värden

Problemet orsakas av det faktum att vissa poster tydligen har flera författare. Så den inre kopplingen i urvalsfrågan som du skrev kommer att returnera flera rader för samma post och INSERT ... ON CONFLICT gillar inte det. Eftersom du bara använder ReferenceAuthor tabell för filtrering kan du helt enkelt skriva om frågan så att den använder den tabellen för att bara filtrera poster som inte har någon författare genom att göra en exists på en korrelerad delfråga. Så här gör du:

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. finns det en gräns för vad sql fiddle kan hantera? sql fiddle kompilerar ingenting och returnerar inga felmeddelanden

  2. pqxx återanvänd / återaktivera en arbetstransaktion

  3. Inaktivera begränsning av främmande nyckel för Doctrine

  4. Mysql gå med i tabeller