Re: Is it possible to write a generic UPSERT?

From: Michael Lewis <mlewis(at)entrata(dot)com>
To: Mario Emmenlauer <mario(at)emmenlauer(dot)de>
Cc: PostgreSQL General <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Is it possible to write a generic UPSERT?
Date: 2020-11-12 17:34:58
Message-ID: CAHOFxGqciJKneQJpxhoiW50S9_VM24vcX+bjPz4WD6uC8FsbKw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Thu, Nov 12, 2020 at 6:58 AM Mario Emmenlauer <mario(at)emmenlauer(dot)de>
wrote:

> I can see how "ON CONFLICT" is very powerful. But that power seems
> often a burden for us. We would prefer something that is less manual
> effort for the specific use case. Basically, we would like:
> INSERT if not exist, and
> UPDATE _all_ non-conflicting fields in case of _any_ conflict
>

If you do not have significant ratio of HOT (heap only tuple) updates that
you want to preserve and you don't have sequences that are GENERATED AS
ALWAYS (rather than BY DEFAULT), you could consider just doing a DELETE
where the keys exist, then insert all the rows. It should be trivial to
figure out the primary key or other unique index to match on.

MERGE command is implemented for this use case in some DBMS, but not
Postgres (yet?).

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Bruce Momjian 2020-11-12 17:39:55 Re: Encryption with customer provided key in a multi tenant Postgres JSONB DB
Previous Message Mario Emmenlauer 2020-11-12 17:03:07 Re: Is it possible to write a generic UPSERT?