UPDATE
SQL příkaz UPDATE
upravuje data (záznamy) v relační databázi. Může být upraven jediný záznam, nebo i více záznamů najednou. Upravené záznamy musí odpovídat definované podmínce.
UPDATE
má následující syntaxi:
UPDATE <tabulka>
SET <nazev_sloupecku> = <hodnota> [,...n]
[FROM <zdrojova tabulka (tabulky)>]
[WHERE <podminka>]
Aby se příkaz UPDATE
úspěšně provedl, musí mít uživatel práva na manipulaci dat v databázi. Nové hodnoty také nesmí kolidovat s podmínkami (např. primární klíč, jedinečný index, podmínky CHECK
a NOT NULL
).
Příklady
Počáteční obsah tabulky T
C1 | C2 | C3 |
---|---|---|
100 | a | x |
105 | b | x |
110 | c | x |
Pro nastavení sloupečku C1 v tabulce T na hodnotu 1, ale pouze za podmínky že hodnota sloupečku C2 je „a“.
UPDATE T SET C1 = 1 WHERE C2 = 'a'
C1 | C2 | C3 |
---|---|---|
1 | a | x |
105 | b | x |
110 | c | x |
Zvýšení hodnoty sloupečku C1 o 1 pokud C2 je „a“.
UPDATE T SET C1 = C1 + 1 WHERE C2 = 'a'
C1 | C2 | C3 |
---|---|---|
2 | a | x |
105 | b | x |
110 | c | x |
Přidání ke sloupečku C3 řetězec „text“ pokud C2 je „a“.
UPDATE T SET C3 = CONCAT( 'text' , C1 ) WHERE C2 = 'a'
C1 | C2 | C3 |
---|---|---|
2 | a | text2 |
105 | b | x |
110 | c | x |
Další vlastnosti
Vykonávání příkazu
U příkazu UPDATE se rozlišuje, které hodnoty jsou konstantní po dobu jeho vykonávání a které se mění s každým řádkem. Pokud hodnoty (nebo výrazy z nich), které příkaz UPDATE sloupcům přiřazuje, obsahují jména sloupců dané tabulky (nebo tabulek spojených přes JOIN), pak je systém řízení báze dat bere z každého aktuálního řádku. Například pro tabulku produktů se sloupečky cen bez a s DPH příkaz:
UPDATE produkty SET cena_s_DPH = cena_bez_DPH * 1.20;
aktualizuje cenu s DPH na základě ceny bez DPH u každého jednotlivého záznamu.
Příkaz UPDATE mění hodnoty řádku v tom pořadí sloupců, ve kterém jsou v příkazu uvedeny, přičemž po každém přiřazení se mohou ty následující operovat s již změněnou hodnotou buňky. Mohou tak vzniknout konstrukce jako následující (v MySQL):
UPDATE tabulka SET flags=flags|0x80, flags=flags&~0x40, cislo=flags+1 WHERE id=123;
Pokud je v daném záznamu tabulky je hodnota číselného sloupce flags rovna např. 127 (tj. 7F hexadecimálně), pak první přiřazení u něj nastaví bit č. 8 (0x80 nebo též 128, bude tedy rovna 255), druhá část příkazu vynuluje bit č. 6 (0x40 nebo též 64, po přiřazení bude 191) a třetí část přiřadí sloupci cislo hodnotu tohoto již dvakrát změněného sloupce flags, navýšenou o jedničku (bude to hodnota 192 – vkládá se tedy již změněná hodnota po doposud proběhlých přiřazeních, nikoli hodnota před začátkem vykonávání příkazu).
Pokud by například v poslední části příkazu byla syntaktická nebo jiná chyba (například sloupec cislo by v tabulce neexistoval), pak se příkaz UPDATE nespustí jako celek. Z tohoto úhlu pohledu je UPDATE atomická operace. To neplatí pro změnu více záznamů – pokud by například měnil data u 1000 záznamů a po 500. z nich by došlo k nějaké fatální chybě (např. vstupně výstupní chyba úložného média), prvních 500 záznamů by zůstalo změněných a druhá polovina nikoli.
Výchozí hodnota
Většina databázových systémů umožňuje nastavit hodnotu určeného sloupce na výchozí hodnotu použitím klíčového slova DEFAULT. To reprezentuje jakoukoli výchozí hodnotu, která byla u daného sloupce nadefinována. Pokud definována nebyla, SŘBD se buď pokusí přiřadit prázdné řetězce pro textové sloupce a nuly pro sloupce číselné, nebo příkaz skončí chybovou hláškou ke změně hodnoty buňky vůbec nedojde. Hodnotu DEFAULT většina databázových systémů umožňuje použít i ve výrazu, většinou pro to ale nemá využití.
Omezení počtu změněných záznamů
U příkaz UPDATE může být elegantně omezen maximálním počtem záznamů, které mohou být příkazem změněny. Omezení se provede klíčovým slovem LIMIT. Po dosažení tohoto počtu změněných záznamů se příkaz ukončí. Pro jistotu, že nezměníme více než jeden záznam, můžeme za příkaz vložit LIMIT 1;. Pokud je záznam, který se má měnit, identifikován klausulí WHERE pomocí hodnoty primárního klíče (jak tomu většinou je), je automaticky zajištěno, že záznam bude změněn maximálně jeden, protože více záznamů se stejnou hodnotou klíče v tabulce existovat nemůže.
INSERT…ON DUPLICATE KEY UPDATE…
Příkaz UPDATE může být též použit jako klausule u složené konstrukce INSERT…ON DUPLICATE KEY UPDATE…. V ní se v první řadě SŘBD snaží data vložit jako nový záznam, teprve v případě, že tento záznam existuje (což zjistí podle stejné hodnoty primárního klíče) provede nad tímto záznamem příkaz UPDATE.
Triggery
Příkaz UPDATE aktivuje před svým vykonáním trigger (spoušť) definovaný s BEFORE UPDATE a po vykonání trigger s AFTER UPDATE. Toto samozřejmě platí, jsou-li příslušné spouště definovány.