Ano, připojte své vstupní řádky k odkazované tabulce, čímž odstraníte řádky bez shody ve sloupci FK:
INSERT INTO entries(entry_id, referenced_id, name)
SELECT val.entry_id, val.referenced_id, val.name
FROM (
VALUES (1, 2, 'references two')
-- more?
) val (entry_id, referenced_id, name)
JOIN referenced USING (referenced_id) -- drop rows without matching FK
ON CONFLICT (entry_id) DO NOTHING; -- drop rows with duplicate id
Samotný UPSERT (INSERT ... ON CONFLICT DO NOTHING
) reaguje pouze na jedinečná porušení. Manuál:
ON CONFLICT
lze použít k určení alternativní akce k vyvolání chyby porušení jedinečného omezení nebo omezení vyloučení. (Viz níže uvedená doložka O KONFLIKTu.)
Protože VALUES
výraz nyní není připojen k INSERT
přímo, typy sloupců nejsou odvozeny z cílové tabulky. Možná budete muset odeslat vstupní hodnoty explicitně při provozu s nezákladními typy. Viz:
- Při aktualizaci více řádků odesílání typu NULL