Tak, połącz swoje wiersze wejściowe z tabelą odniesienia, usuwając w ten sposób wiersze bez dopasowania w kolumnie 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
Sam UPERT (INSERT ... ON CONFLICT DO NOTHING
) reaguje tylko na unikalne naruszenia. Instrukcja:
ON CONFLICT
może służyć do określenia akcji alternatywnej do zgłaszania błędu unikatowego ograniczenia lub naruszenia ograniczenia wykluczenia. (Patrz klauzula O KONFLIKTACH poniżej).
Ponieważ VALUES
wyrażenie nie jest teraz dołączone do INSERT
bezpośrednio typy kolumn nie pochodzą z tabeli docelowej. Może być konieczne przesyłanie wartości wejściowe jawnie podczas pracy z typami innymi niż podstawowe. Zobacz:
- Rzutowanie typu NULL podczas aktualizowania wielu wierszy