sql >> Databáze >  >> RDS >> PostgreSQL

Lze INSERT [...] ON CONFLICT použít pro porušení cizího klíče?

Ano, připojte své vstupní řádky k odkazované tabulce, čímž odstraníte řádky bez shody ve sloupci 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

Samotný UPSERT (INSERT ... ON CONFLICT DO NOTHING ) reaguje pouze na jedinečná porušení. Manuál:

ON CONFLICT lze použít k určení alternativní akce k vyvolání chyby porušení jedinečného omezení nebo omezení vyloučení. (Viz níže uvedená doložka O KONFLIKTu.)

Protože VALUES výraz nyní není připojen k INSERT přímo, typy sloupců nejsou odvozeny z cílové tabulky. Možná budete muset odeslat vstupní hodnoty explicitně při provozu s nezákladními typy. Viz:

  • Při aktualizaci více řádků odesílání typu NULL



  1. Použití uložené procedury Sqlite v systému Android

  2. Výhody a nevýhody používání uložených procedur

  3. Jak převést celé číslo na desítkové v SQL Server

  4. 6 způsobů, jak vybrat duplicitní řádky v Oracle