Re: Insert works but fails for merge - Mailing list pgsql-general

From Alban Hertroys
Subject Re: Insert works but fails for merge
Date
Msg-id A0C7725A-C82D-4B62-A485-D1C4CE7C5A8E@gmail.com
Whole thread Raw
In response to Re: Insert works but fails for merge  (yudhi s <learnerdatabase99@gmail.com>)
Responses Re: Insert works but fails for merge
List pgsql-general
> On 10 Aug 2024, at 22:23, yudhi s <learnerdatabase99@gmail.com> wrote:
> On Sat, Aug 10, 2024 at 8:22 PM Adrian Klaver <adrian.klaver@aklaver.com> wrote:
> > MERGE INTO tab1 AS target
> > USING (VALUES ('5efd4c91-ef93-4477-840c-a723ae212d99', 123,
> > '2024-08-09T11:33:49.402585600Z','2024-08-09T11:33:49.402585600Z')) AS
> > source(id, mid,txn_timestamp, cre_ts)
> > ON target.id <http://target.id> = source.id <http://source.id>
> > WHEN MATCHED THEN
> > UPDATE SET mid  = source.mid
> > WHEN NOT MATCHED THEN
> > INSERT (id, mid, txn_timestamp, cre_ts)
> >      VALUES (source.id <http://source.id>,source.mid,
> >   source.txn_timestamp, source.cre_ts);
>
> Actually , as per the business logic , we need to merge on a column which is not unique or having any unique index on
it.

Then how is the database supposed to determine which of those duplicate rows it should update? In the best case, it
wouldupdate all of the duplicates with the same values, which usually is not what you want. 

> It's the leading column of a composite unique key though.

Which could be unique of itself, I suppose that isn’t the case here?

In that case, IMHO your best course of action is to do something about those duplicates first.

> And in such scenarios the "INSERT.... ON CONFLICT" will give an error. So we are opting for a merge statement here,
whichwill work fine with the column being having duplicate values in it. 

I’m not so sure about that claim…

At least on MSSQL, MERGE has this requirement: "A MERGE statement cannot UPDATE/DELETE the same row of the target table
multipletimes.”. I’ve seen that as an error message on occasion. 

The MERGE documentation for PostgreSQL says this: "You should ensure that the join produces at most one candidate
changerow for each target row.”, which also seems to imply that you shouldn’t have duplicates. 

Alban Hertroys
--
If you can't see the forest for the trees,
cut the trees and you'll find there is no forest.




pgsql-general by date:

Previous
From: Durgamahesh Manne
Date:
Subject: autovacuum freeze recommendations at table level
Next
From: Adrian Klaver
Date:
Subject: Re: Insert works but fails for merge