Re: Is it possible to write a generic UPSERT?

From: Mario Emmenlauer <mario(at)emmenlauer(dot)de>
To: Alban Hertroys <haramrae(at)gmail(dot)com>
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:03:07
Message-ID: 20b9e75e-e6ce-35cc-eb9e-36a14d9f470f@emmenlauer.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 12.11.20 17:55, Alban Hertroys wrote:
>> On 12 Nov 2020, at 14:58, Mario Emmenlauer <mario(at)emmenlauer(dot)de> wrote:
>
> (…)
>
>> But the statement is slightly complex to type, and I find me and my
>> colleagues often spend more time on this than I would hope. Our two
>> main challenges are:
>> (1) we have to look up the uniqueness constraints on the table, and
>> (2) we have to duplicate the insert statement in the UPDATE section
>> again, because virtually all fields should get overwritten
>> (except for the conflicting ones). On long inserts this can be
>> quite annoying and error-prone.
>>
>> 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
>>
>> In my (naiive) thinking, such a construct would cover 99% of our
>> use cases. Or did other people make very different experiences?
>
> (…)
>
>> Has anybody ever done something like this? Is there an SQL way to
>> achieve this? Or another programmatic way?
>
> We generate the SQL @work based on the definitions in, IIRC, the information_schema. It has tables for both the column lists per table and the primary key definitions.
>
> With that, an SQL statement that returns the required SQL statement is easy to generate, after which you can execute it either from a plpgsql execute statement in a function or in a do-block.

This is actually a very very interesting idea! I did not consider
that we could completely generate the statements based on the actual
table information from the information_schema. I need to give this a
bit more thought but I very much like the idea, thanks for pushing me
in a new direction!

All the best,

Mario Emmenlauer

--
BioDataAnalysis GmbH, Mario Emmenlauer Tel. Buero: +49-89-74677203
Balanstr. 43 mailto: memmenlauer * biodataanalysis.de
D-81669 München http://www.biodataanalysis.de/

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Michael Lewis 2020-11-12 17:34:58 Re: Is it possible to write a generic UPSERT?
Previous Message Alban Hertroys 2020-11-12 16:55:25 Re: Is it possible to write a generic UPSERT?