Sim, junte suas linhas de entrada à tabela referenciada, removendo assim as linhas sem correspondência na coluna 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
O próprio UPSERT (
INSERT ... ON CONFLICT DO NOTHING
) reage apenas a violações exclusivas. O manual:
ON CONFLICT
pode ser usado para especificar uma ação alternativa para gerar uma restrição exclusiva ou erro de violação de restrição de exclusão. (Consulte a Cláusula SOBRE CONFLITO abaixo.)
Uma vez que os
VALUES
expressão agora não está anexada a um INSERT
diretamente, os tipos de coluna não são derivados da tabela de destino. Talvez seja necessário transmitir valores de entrada explicitamente ao operar com tipos não básicos. Ver:- Como converter o tipo NULL ao atualizar várias linhas