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.