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

Utilisez INSERT ... ON CONFLICT DO NOTHING RETURNING lignes en échec

Un peu verbeux, mais je ne vois rien d'autre :

with all_tags (name) as (
  values ('tag10'), ('tag6'), ('tag11')
), inserted (id, name) as (
   INSERT INTO tags (name)
   select name 
   from all_tags
   ON CONFLICT DO NOTHING 
   returning id, name
)
select t.id, t.name, 'already there'
from tags t
  join all_tags at on at.name = t.name
union all
select id, name, 'inserted'
from inserted;

La sélection externe parmi les tags voit l'instantané de la table telle qu'elle était avant les nouvelles balises ont été insérées. La troisième colonne avec la constante n'est là que pour tester la requête afin que l'on puisse identifier quelles lignes ont été insérées et lesquelles non.