MERGE
MERGE je v oblasti databází příkaz SQL pro zařazení záznamu do tabulky (ve stejném duchu jako příkaz INSERT), kdy v případě splnění specifikované podmínky je záznam změněn (ve stylu UPDATE). Tomuto způsobu (tedy vložení záznamu nebo jeho úprava v případě, že již existuje) se někdy říká UPSERT (coby blending slov UPDATE a INSERT).
Příkaz MERGE byl zařazen do standardu SQL:2003.
Syntaxe
[editovat | editovat zdroj]Syntaxe MERGE je následující:
MERGE INTO jmeno_tabulky [USING jmeno_tabulky ON (podmínka)]
WHEN MATCHED THEN UPDATE SET sloupec1 = hodnota1 [, sloupec2 = hodnota2 ...]
WHEN NOT MATCHED THEN INSERT (sloupec1 [, sloupec2 ...]) VALUES (hodnota1 [, hodnota2 ...])
Alternativy
[editovat | editovat zdroj]REPLACE INTO
[editovat | editovat zdroj]Některé databáze (MySQL, MariaDb, ProgreSQL…) mají SQL příkaz, který příkaz INSERT kombinuje s příkazem DELETE – tedy: pokud záznam existuje (tj. shoduje v unikátním klíči), pak jej smaže a následně provede vložení ve stylu INSERT INTO….
REPLACE INTO… není zahrnuto ve standardech SQL-92 nebo SQL-99, je na něj nahlíženo jako na příkaz nad tento standard, specifický pro tento typ databáze, s kterým se při případné migraci na jinou databázi nemusí nutně počítat. MySQL/MariaDb po provedení tohoto příkazu hlásí 1 ovlivněný řádek, pokud původní záznam neexistoval, a 2 ovlivněné řádky při existenci původního záznamu (1. po smazání původního řádku, 2. po vložení nového – i v případě, že se ukládají stejné hodnoty jako ty původní). Z počtu ovlivněných řádků se tak jedním příkazem dá (ex post) zjistit, zdali původní záznam existoval.
Mezi REPLACE a MERGE je rozdíl v tom, že pokud záznam již existuje a v daném příkazu není uveden seznam všech sloupců, REPLACE INTO… hodnoty v chybějících sloupcích vymaže (resp. vyplní výchozími hodnotami), kdežto MERGE je zachová. REPLACE INTO… ani MERGE nemění primární klíč (technicky vzato u REPLACE INTO nejde o změnu primárního klíče u jednoho záznamu ale o vymazání tohoto záznamu a následného vložení záznamu s týmž klíčem).
REPLACE INTO stav_objednavky(id, stav) VALUES(3, "na skladě");
INSERT OR REPLACE
[editovat | editovat zdroj]INSERT OR REPLACE je analogický příkaz pro REPLACE INTO, který je používán v databázi SQLite.
eUPDATE OR INSERT INTO
[editovat | editovat zdroj]UPDATE OR INSERT INTO je analogický příkaz pro INSERT OR REPLACE. Tento zápis je používán v databázi Firebird.
…ON DUPLICATE KEY
[editovat | editovat zdroj]…ON DUPLICATE KEY (volitelná klauzule příkazu INSERT v MySQL)
Mezi další prostředky může patřit technika zkusit záznam vložit a odchytit a zareagovat na chybovou hlášku v případě, že záznam již existuje. Tím se blíží významu příkazu MERGE, dokonce víc než REPLACE INTO, neboť stejně jako MERGE hodnoty nespecifikovaných sloupců záznamu nemaže.
UPSERT
[editovat | editovat zdroj]UPSERT je opět obdoba MERGE, coby portmanteau UPDATE a INSERT. Je podporována např. v Microsoft SQL Azure a MongoDB.
Odkazy
[editovat | editovat zdroj]Reference
[editovat | editovat zdroj]V tomto článku byl použit překlad textu z článku Merge (SQL) na anglické Wikipedii.
