Re: MERGE vs REPLACE - Mailing list pgsql-hackers

From Simon Riggs
Subject Re: MERGE vs REPLACE
Date
Msg-id 1132000496.3388.31.camel@holly
Whole thread Raw
In response to Re: MERGE vs REPLACE  (Martijn van Oosterhout <kleptog@svana.org>)
Responses Re: MERGE vs REPLACE
Re: MERGE vs REPLACE
List pgsql-hackers
On Sun, 2005-11-13 at 23:56 +0100, Martijn van Oosterhout wrote:
> On Sun, Nov 13, 2005 at 11:32:47PM +0100, Petr Jelinek wrote:
> > I am really not db expert and I don't have copy of sql standard but you 
> > don't need to use 2 tables I think - USING part can also be subquery 
> > (some SELECT) and if I am right then you could simulate what REPLACE 
> > does because in PostgreSQL you are not forced to specify FROM clause in 
> > SELECT. So you could in theory do
> > MERGE INTO tablename USING (SELECT 1 AS myid) ON (tablename.id = myid) ...
> > But I am not sure if this is what you want.
> 
> Well, the obvious extension to this is that the extire USING clause is
> in fact optional:
> 
> MERGE INTO tablename ON id = 1 ...
> 
> Which starts looking a lot simpler.
> 

...choosing a place to jump in is a little hard in this thread...so I'll
jump in with some general info and thoughts on topics so far:

MERGE is useful both for OLTP systems and for Data Warehousing, where it
is sometimes known as the UPSERT. The MERGE statement in SQL:2003
requires a target table and a table statement. I don't see anything in
that to always require two separate tables - this is just the same as a
self-referencing INSERT SELECT statement. The USING clause is also a
compulsory part of SQL:2003.

One of the more interesting ways to use MERGE is with Oracle external
tables. The same idea for us would be to have MERGE become a variant of
the PostgreSQL COPY FROM command. That would be very cool.

The above is the reason why MERGE doesn't seem to provide for external
data being passed, as does INSERT or MySQL REPLACE.

Neither DB2 or Oracle perform predicate locking. DB2 is more cautious,
and some would say more efficient, thats all. PostgreSQL's locking
features are just fine for pragmatic implementation of MERGE, AFAICS.
Where there is doubt, we should fall back to table locking just like the
rest of the world, IMHO. Making this work with partitioning will be hard
enough without overusing the predicate solving logic.

The UPSERT concept is also supported by Teradata, who simply append an
ELSE INSERT clause onto the standard UPDATE syntax. MySQL REPLACE seems
to me to be a fairly small subset of MERGE functionality and we ought to
be able to offer that functionality as a side branch of the main work.

I've been looking at ways of doing INSERT then UPDATE, but it doesn't
seem very easy to avoid unique index violations in that case. So doing
the UPDATE first then INSERTs later seems like the way to go.

Best Regards, Simon Riggs



pgsql-hackers by date:

Previous
From: "Jim C. Nasby"
Date:
Subject: Re: MERGE vs REPLACE
Next
From: Merlin Moncure
Date:
Subject: Re: 8.0 -> 8.1 dump duplicate key problem?