MERGE

Z Wikipedie, otevřené encyklopedie

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.

UPDATE 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.

Externí odkazy[editovat | editovat zdroj]