PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden Sie INSERT ... ON CONFLICT DO NOTHING RETURNING fehlgeschlagene Zeilen

Ein bisschen ausführlich, aber mir fällt nichts anderes ein:

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;

Die äußere Auswahl aus tags sieht den Schnappschuss der Tabelle, wie sie vorher war Die neuen Tags wurden eingefügt. Die dritte Spalte mit der Konstante ist nur dazu da, die Abfrage zu testen, damit man erkennen kann, welche Zeilen eingefügt wurden und welche nicht.