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.
Obsah |
Syntaxe [editovat]
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]
REPLACE [editovat]
Některé databáze (MySQL, 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 „bonus“, s kterým se při případné migraci na jinou databázi nemusí nutně počítat. MySQL hlásí při existenci původního záznamu 2 ovlivněné řádky, jinak 1 ovlivněný řádek – dá se tak (ex post) jedním příkazem 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… 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]
INSERT OR REPLACE je analogický příkaz pro REPLACE INTO, který je používán v databázi SQLite.
UPDATE OR INSERT INTO [editovat]
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]
…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]
UPSERT je opět obdoba MERGE, coby portmanteau UPDATE a INSERT. Je podporována např. v Microsoft SQL Azure a MongoDB.
Odkazy [editovat]
Reference [editovat]
V tomto článku byl použit překlad textu z článku Merge (SQL) na anglické Wikipedii.