Hi Francesco, On Mon, Apr 26, 2010 at 12:38 AM, Francesco Riosa <[email protected]> wrote: >>> 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
I read the blog - do you mean the part where he mentions new features in SQL:2011: "Constraints can optionally be set to NO ENFORCE. That means the database system won't enforce them but still assumes they are valid, for example for optimization." Remarkable feature. I don't have drafts for the 2011 version of the standard, so I can't read up on it, but I am not sure I'm too happy with this... In as far this is relevant to the matching behaviour, I still think the MERGE...ON construct is much more powerful (and clear!) than this. (Just my opinion) kind regarrds. > >> >>> 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 > -- 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 _______________________________________________ Mailing list: https://launchpad.net/~drizzle-discuss Post to : [email protected] Unsubscribe : https://launchpad.net/~drizzle-discuss More help : https://help.launchpad.net/ListHelp

