MSSQL UPSERT, INSERT INTO ... ON DUPLICATE KEY UPDATE

Programátor MySQL databází přechází na MSSQL. MSSQL je pro mne naprostá novinka a zároveň zděšením. Zatím jsem zelenáč a tak budu popisovat mnoho rozdílů mezi styly programování na které jsem jako programátor MySQL zvyklý.


Prvně mě zklamala kompletní informační základna okolo MSSQL. MSDN Books Online mně přišlo hodně chaotické, ale dá se v tom zoorientovat, avšak na bohaté praktické ukázky použití nebo rozsáhlé příspěvky můžete zapomenout. Podobně je na tom většina internetových zdrojů i tištěných publikací. Internetových diskusí na toto téma je poskromnu a převážně se jedná o nedořešené problémy nebo odpovědi typu: ,,Proč to dělat tak, když to jde i se základy" (jinak řečeno, diskuse je zabitá a ani po třech letech není problém vyřešen, škoda kliknutí v google). Jakýkoli zájem o nějakou optimalizaci žádný, komunita programátorů okolo MSSQL se pravděpodobně soustředí (a to z pochopitelných důvodů) převážně na komerční úrovni a o své problémy se dělí uvnitř firmy.

Jedním z takových problémů jsou běžné SQL dotazy využívané na MySQL, např. INSERT INTO ... ON DUPLICATE KEY UPDATE, zkracovaný někdy jako UPSERT, v některých publikacích je uváděn jako optimalizační metoda, např. v publikaci MySQL - Oficiální průvodce tvorbou, správou a laděním databází (strana 182), tuto metodu zmiňuji i v článku INSERT INTO ... ON DUPLICATE UPDATE, ale co když nechceme, aby se nový záznam vytvořil, ale jen upravil existující?, související diskuse pod článkem však její platnost popírá a proto byla diskuse rozšířena o článek Jeden dotaz do databáze nebo tisíce? ... je to stejné? Tento článek řeší nejužší místo mezi databází a databázovým layerem, zdá se že MySQLi si dokáže celkem úspěšně poradit s tisíci dotazy i položenými zvlášť, ovšem při připojení přes ODBC řešíme znovu stejný problém.

Při hledání alternativy této metody pro MSSQL jsem našel pouze toto řešení:

  1. IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
  2. UPDATE Table1 SET (...) WHERE Column1='SomeValue'
  3. ELSE
  4. INSERT INTO Table1 VALUES (...)

Vhodnější, by mohl být tento přístup:

  1. UPDATE Table1 SET (...) WHERE Column1='SomeValue'
  2. IF @@ROWCOUNT=0 INSERT INTO Table1 VALUES (...)

Co na to říkáte? Ještě to tak napsat jako hromadný insert!

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
25.02.2009 13:02 | Anonym (tz) | SQL-příkaz MERGE

SQL Server 2008 Books Online > MERGE http://technet.microsoft.com/…b510625.aspx

25.02.2009 13:07 | Anonym (Radek Hulán) | REPLACE INTO

V MySQL na to existuje ještě snazší REPLACE INTO.

Jinak v SQL Serveru můžeš použít příkaz MERGE, popřípadě udělat UPDATE, a pokud @@rowcount = 0 (počet aktualizovaných záznamů), tak následně INSERT. Snadné.. Každopádně dělat nejdříve SELECT je pitomost.

25.02.2009 13:08 | Anonym (Radek Hulán) | MERGE

Jinak MERGE je podporován od SQL Server 2008.

25.02.2009 17:49 | Administrátor | Re: MERGE

což by mohl být pro někoho problém, aktuálně pro mne je a nemohu využít SQL2008

26.02.2009 10:50 | Anonym (Radek Hulán) | knihy

K té dokumentaci – na MSDN Books Online je výborná, a ještě lepší je její integrace do SQL Server Management Studia.

Každopádně je dobré si koupit i knihu – pokud jsi začátečník, tak třeba „Beginning SQL Server 2008 for Developers“ pro základy, a poté „Pro T-SQL 2008 Programmer­s's Guide“ pro pokročilé T-SQL funkce, procedury, triggery a další. Oboje je od APressu a z amazon.co.uk ti to doručí do 3 dnů.

26.02.2009 17:46 | Anonym (Jozef Sevcik) | :)

„MSSQL je pro mne naprostá novinka a zároveň zděšením.“ Pockajte az dojdete k tomu jak sa v MSSQL robi strankovanie. Potom mozte blognut svoje pocity ;)

17.04.2009 11:17 | Anonym (hydrant) | Re: :)

Ufff… strankovanie, normalne ma striaslo. To som riesil v MSSQL zhruba pred troma rokmi… No ale mam dojem ze to chceli upravit a tipol by som ze uz to podporuju nejako normalne. Neviem… v sucastnosti som viac robil s MySQL…

Ale moj nazor je, ze MSSQL je podstatne kvalitnejsi software (a to neporovnatelne!) oproti MySQL…

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>