PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

INSERT [...] ON CONFLICT peut-il être utilisé pour les violations de clé étrangère ?

Oui, joignez vos lignes d'entrée à la table référencée, supprimant ainsi les lignes sans correspondance sur la colonne 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

L'UPSERT lui-même (INSERT ... ON CONFLICT DO NOTHING ) ne réagit qu'aux violations uniques. Le manuel :

ON CONFLICT peut être utilisé pour spécifier une action alternative au déclenchement d'une erreur de violation de contrainte unique ou d'exclusion. (Voir la clause ON CONFLICT ci-dessous.)

Depuis les VALUES l'expression n'est plus attachée à un INSERT directement, les types de colonne ne sont pas dérivés de la table cible. Vous devrez peut-être caster valeurs d'entrée explicites lors de l'utilisation de types non basiques. Voir :

  • Diffusion du type NULL lors de la mise à jour de plusieurs lignes