Ja, voeg uw invoerrijen toe aan de tabel waarnaar wordt verwezen, en verwijder daarmee rijen zonder overeenkomst in de FK-kolom:
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
De UPSERT zelf (INSERT ... ON CONFLICT DO NOTHING
) reageert alleen op unieke overtredingen. De handleiding:
ON CONFLICT
kan worden gebruikt om een alternatieve actie op te geven voor het opwerpen van een unieke beperking of schending van een uitsluitingsbeperking. (Zie ON CONFLICT-clausule hieronder.)
Sinds de VALUES
expressie is nu niet gekoppeld aan een INSERT
direct worden kolomtypen niet afgeleid van de doeltabel. Mogelijk moet je casten waarden expliciet invoeren bij het werken met niet-basistypen. Zie:
- NULL-type casten bij het bijwerken van meerdere rijen