Ja, verbinden Sie Ihre Eingabezeilen mit der referenzierten Tabelle, wodurch Zeilen ohne Übereinstimmung in der FK-Spalte entfernt werden:
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
Der UPSERT selbst (INSERT ... ON CONFLICT DO NOTHING
) reagiert nur auf eindeutige Verstöße. Das Handbuch:
ON CONFLICT
kann verwendet werden, um eine alternative Aktion zum Auslösen eines Fehlers bei der Verletzung einer eindeutigen Einschränkung oder eines Ausschlusses von Einschränkungen anzugeben. (Siehe ON CONFLICT-Klausel unten.)
Da die VALUES
Ausdruck wird jetzt nicht an ein INSERT
angehängt direkt werden Spaltentypen nicht von der Zieltabelle abgeleitet. Möglicherweise müssen Sie casten Eingabewerte explizit beim Arbeiten mit Nicht-Basistypen. Siehe:
- Umwandeln des NULL-Typs beim Aktualisieren mehrerer Zeilen