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.

SyntaxeEditovat

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 ...])

AlternativyEditovat

REPLACE INTOEditovat

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 REPLACEEditovat

INSERT OR REPLACE je analogický příkaz pro REPLACE INTO, který je používán v databázi SQLite.

UPDATE OR INSERT INTOEditovat

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 KEYEditovat

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

UPSERTEditovat

UPSERT je opět obdoba MERGE, coby portmanteau UPDATE a INSERT. Je podporována např. v Microsoft SQL Azure a MongoDB.

OdkazyEditovat

ReferenceEditovat

V tomto článku byl použit překlad textu z článku Merge (SQL) na anglické Wikipedii.

Externí odkazyEditovat