PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Use INSERT ... ON CONFLICT DO NOTHING RETURNING linhas com falha


Um pouco verboso, mas não consigo pensar em mais nada:
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;

A seleção externa de tags vê o instantâneo da tabela como era antes as novas tags foram inseridas. A terceira coluna com a constante serve apenas para testar a consulta para que se possa identificar quais linhas foram inseridas e quais não.