>Hi Francesco,
>
>On Sun, Apr 25, 2010 at 2:58 PM, Francesco Riosa <[email protected]> 
wrote:
>> Just wanted to tell that many applications I write work exactly with this
>> logic, check if a record exist, than go with an insert or an update, there 
are
>> however a two important points which maybe the MERGE syntax does not cover:
>> 1) when an insert happen I need the primary key used (in my case a 64bit 
id)
>
>You mean, you need it for subsequent statements or program logic (as
>opposed to, in the current row of the MERGE statement)?
>If that is the case, then I agree, that would be very useful, but I
>don't think there's any MySQL syntax that support it.
>In other words, that would be a completely new functionality, no?

yes it's mean for program logic, and yes it would be a completely new 
functionality, currently I do it with a pair of python/php functions.

>
>> 2) for many insert a row is considered to be duplicate even if there are no
>> collision with unique indexes (seem to be satisfied by the previous example)
>
>Well, I think that this is something that MERGE can solve, because you
>control the match condition yourself explicitly (in the ON clause).
>REPLACE INTO or ON DUPLICATE KEY UPDATE have a more limited matching
>condition, that requires one of the unique constraints or primary key
>to match.

exactly, tough it could be solved for current syntax by the "NO ENFORCE" 
index property introduced by SQL 2011?
first seen in http://petereisentraut.blogspot.com/2010/04/news-from-sql-
standard.html

>
>> to be really useful in these cases the sintax would be something like:
>> MERGE INTO table_name USING table_name ON (condition)
>> WHEN MATCHED THEN
>> *UPDATE SET column1 = value1 [, column2 = value2 ...]*
>> WHEN NOT MATCHED THEN
>> *INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...*
>> ALWAYS SELECT (column1 [, column2 ...])
>>
>> does it make sense?
>
>Do you mean, the ALWAYS SELECT would return the matched set as it
>looks like after the INSERT/UPDATEs have taken place? (which would
>include all values as they are stored in the table, including any
>generated values caused by auto_increment columns, column level
>defaults, and, in case drizzle would support them, timestamp columns
>and triggers)
>
>If so, then yes, that makes sense to me.

Yes the SELECT should return values from the matched row _after_ it has been
(eventually) modified or inserted

>
>
>>
>>>As we can see merge works like a sub query fashion. and UPDATE and INSERT
>>>are part of it (3rd and 5th line).
>>>so in effect MERGE statement splits into a SELECT statement (1st line)
>>>followed by UPDATE or INSERT.
>>
>>>Here the advantage is, UPDATE and INSERT are explicit. so no ambiguity
>>>remains.
>>
>>>But this is not the case of REPLACE, need a investigation of the return 
pair
>>>to understand actually what happened inside.
>>
>>>Am i right?
>>
>>>Thank you,
>>>Jobin.
>>
>>>On Sun, Apr 25, 2010 at 10:24 PM, Jobin Augustine <[email protected]> 
wrote:
>>
>>>> Hi Roland,
>>>>
>>>> Yes!. MERGE can be used as a replacement for REPLACE. :)
>>>> but in practical, it is difficult to write REPLACE using MERGE.
>>>> i hope nobody will do that,  just give a try. i bet you will give up :)
>>>>
>>>> MERGE statement is designed to serve other purposes very efficiently.
>>>> where we deal with multiple tables.
>>>> For example.
>>>>
>>>>  1. Warehousing / Reporting systems require "merging" data from 
normalized
>>>> transaction tables into different models
>>>>  2. Archiving old data, merge new data into your archive tables very
>>>> efficiently.
>>>>
>>>> I am not against any extra features like REPLACE.
>>>> but just conscious about the extra complexity it adds to the code bases 
and
>>>> propages to other plugins (yet to born ones also)
>>>> more complexity means more bugs.
>>>> referring above proposal, insertRecord returning a pair !
>>>>
>>>> Thank you,
>>>> Jobin.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Sun, Apr 25, 2010 at 1:53 PM, Roland Bouman
>> <[email protected]>wrote:
>>>>
>>>>> Actually, after some more reading I now get the impression that MERGE
>>>>> INTO does allow for the same flexibility in handling UPDATEs
>>>>> differently from the INSERTs, and is in fact even more flexible as it
>>>>> allows a separate set to identify the target records.
>>>>>
>>>>> On Sun, Apr 25, 2010 at 1:14 AM, Roland Bouman <[email protected]>
>>>>> wrote:
>>>>> > Gah...I replied to Jobin, but forgot to reply to Jay and the list....
>>>>> >
>>>>> > here goes:
>>>>> >
>>>>> > Hi Jobin,
>>>>> >
>>>>> > On Sat, Apr 24, 2010 at 10:20 PM, Jobin Augustine <[email protected]>
>>>>> wrote:
>>>>> >> is this REPLACE is something so useful?.
>>>>> >> are developers are aware and using it to a good extend?
>>>>> >
>>>>> > In my opinion, it is useful. I don't think there is any statistic on
>>>>> > whether developers are making legitimate use of it. But then, this
>>>>> > information is also not available for any other SQL feature.
>>>>> >
>>>>> >> I don't see it in SQL standards and other planets (Postgres,
>>>>> Oracle,...)
>>>>> >
>>>>> > In the SQL standard, the MERGE INTO statement offers similar (although
>>>>> > not equivalent) functionality
>>>>> >
>>>>> > <merge statement> ::=
>>>>> >   MERGE INTO <target table> [ [ AS ] <merge correlation name> ]
>>>>> >   USING <table reference>
>>>>> >   ON <search condition> <merge operation specification>
>>>>> >
>>>>> > (ISO/IEC 9075-2:2003 (E) 14.9   <merge statement>, page 837)
>>>>> >
>>>>> > It is similar in that matching existing rows are updated, and if there
>>>>> > are no such rows, they will be inserted.
>>>>> > Personally I find the standardese particular dense and hard to
>>>>> > understand, but this wikipedia entry explains it nicely:
>>>>> >
>>>>> >
>> 
http://en.wikipedia.org/wiki/Merge_(SQL)<http://en.wikipedia.org/wiki/Merge_%28SQL%29>
>>>>> >
>>>>> > Personally I like MySQL's REPLACE and ON DUPLICATE KEY constructs
>>>>> > better because they don't just merge the data, but allow you a IMO
>>>>> > flexible and natural way to handle the updates differently than the
>>>>> > inserts. But this is besides your point: the standard offers an 
"Upsert"
>>>>> > construct just like MySQL, but it is called MERGE INTO, and not
>>>>> > REPLACE INTO (or INSERT ... ON DUPLICATE KEY UPDATE)
>>>>> >
>>>>> >> for me, REPLACE is as bad as silent commits (in many planets it 
happens
>>>>> >> before DDL)
>>>>> >
>>>>> > Ok. Then don't use it :)
>>>>> >
>>>>> >> all these headache may go if we could discontinue support for 
mysqlism.
>>>>> >
>>>>> > That would postpone the problem until drizzle would add
>>>>> > support for SQL standard MERGE INTO syntax.
>>>>> > In other words, it would need to be solved anyway.
>>>>> >
>>>>> > kind regards,
>>>>> >
>>>>> > Roland
>>>>> >
>>>>> >>
>>>>> >> Thank you,
>>>>> >> Jobin.
>>>>> >>
>>>>> >>
>>>>> >>
>>>>> >> _______________________________________________
>>>>> >> Mailing list: https://launchpad.net/~drizzle-
>> discuss<https://launchpad.net/%7Edrizzle-discuss>
>>>>> >> Post to     : [email protected]
>>>>> >> Unsubscribe : https://launchpad.net/~drizzle-
>> discuss<https://launchpad.net/%7Edrizzle-discuss>
>>>>> >> More help   : https://help.launchpad.net/ListHelp
>>>>> >>
>>>>> >>
>>>>> >
>>>>> >
>>>>> >
>>>>> > --
>>>>> > Roland Bouman
>>>>> > http://rpbouman.blogspot.com/
>>>>> >
>>>>> > Author of "Pentaho Solutions: Business Intelligence and Data
>>>>> > Warehousing with Pentaho and MySQL",
>>>>> > http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470484322.html
>>>>> >
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Roland Bouman
>>>>> http://rpbouman.blogspot.com/
>>>>>
>>>>> Author of "Pentaho Solutions: Business Intelligence and Data
>>>>> Warehousing with Pentaho and MySQL",
>>>>> http://www.wiley.com/WileyCDA/WileyTitle/productCd-0470484322.html

Thanks for taking the time to explain/extend better the original explanation

_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to