PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kann INSERT ON CONFLICT für Fremdschlüsselverletzungen verwendet werden?

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