Ja, anslut dina inmatningsrader till den refererade tabellen och tar därigenom bort rader utan matchning i FK-kolumnen:
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
Själva UPSERT (INSERT ... ON CONFLICT DO NOTHING
) reagerar bara på unika överträdelser. Manualen:
ON CONFLICT
kan användas för att specificera en alternativ åtgärd till att höja ett unikt begränsnings- eller uteslutningsbegränsningsfel. (Se ON CONFLICT-klausul nedan.)
Sedan VALUES
uttryck är nu inte kopplat till en INSERT
direkt härleds inte kolumntyper från måltabellen. Du kan behöva casta ingångsvärden uttryckligen när du arbetar med icke-grundläggande typer. Se:
- Casta NULL-typ vid uppdatering av flera rader