sql >> Databasteknik >  >> RDS >> PostgreSQL

Kan INSERT [...] ON CONFLICT användas för kränkningar av främmande nyckel?

Ja, anslut dina inmatningsrader till den refererade tabellen och tar därigenom bort rader utan matchning i FK-kolumnen:

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

Själva UPSERT (INSERT ... ON CONFLICT DO NOTHING ) reagerar bara på unika överträdelser. Manualen:

ON CONFLICT kan användas för att specificera en alternativ åtgärd till att höja ett unikt begränsnings- eller uteslutningsbegränsningsfel. (Se ON CONFLICT-klausul nedan.)

Sedan VALUES uttryck är nu inte kopplat till en INSERT direkt härleds inte kolumntyper från måltabellen. Du kan behöva casta ingångsvärden uttryckligen när du arbetar med icke-grundläggande typer. Se:

  • Casta NULL-typ vid uppdatering av flera rader



  1. 6 problemfrågor som kraftigt saktar ner din databas

  2. migrera data från MS SQL till PostgreSQL?

  3. ExecuteNonQuery för SELECT SQL-sats som returnerar inga rader

  4. DATEDIFF-funktion i Oracle