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

Postgresql, je nach Fall aktualisieren oder einfügen

Ich wollte dies auch tun, nachdem ich mich damit befasst und ein wenig versucht und geirrt hatte, kam ich zu dieser funktionierenden Lösung.

Verwenden Sie den with Erklärung

with
u as (
  update my_table
    set some_value = $2
  where
    id = $1
  returning *
)
,
i as (
  insert into my_table (id, some_value)
    select $1, $2
  where 
    not exists(select * from u)
  returning *
)

select * from u
union
select * from i;

Versuchen Sie, die Aktualisierung zuerst mit der aktualisierten Zeile zurückzugeben. Wenn von der Aktualisierung keine Zeile zurückgegeben wird, fügen Sie dann die Zeile ein, die die eingefügte Zeile zurückgibt. Wählen Sie dann eine Vereinigung der zurückgegebenen Werte aus der Aktualisierung und der Einfügung aus, da nur einer auftritt, erhalten Sie nur eine zurückgegebene Zeile.

Hoffe das hilft