Zapomenuté WHERE

Co se stane, když UPDATE nemá WHERE? Změní každý řádek tabulky. Tento příkaz měl přestěhovat do Prahy jednoho zákazníka:

UPDATE zakaznici
SET mesto = 'Praha';

Na kartě Výsledky stojí Změněné řádky: 14: všichni zákazníci obchodu teď bydlí v Praze a jejich skutečná města jsou pryč:

jmenomesto
Eva NovotnáPraha
Jakub DvořákPraha
Tereza SvobodováPraha
……

Databáze se neptá, jestli jste si jistí, a tlačítko Zpět nemá. Totéž platí pro DELETE, který poznáte v dalším cvičení: bez WHERE smaže všechny řádky tabulky. Je to jedna z nejznámějších chyb v programování a stává se i zkušeným programátorům, většinou když příkaz spustí dřív, než ho dopíšou. Tady data vrátí další spuštění. Ve skutečné databázi je jedinou cestou zpět záloha, pokud nějaká je.

Jak se chránit:

  • Napište nejdřív WHERE a vyzkoušejte ho v SELECT. Než řádky změníte, podívejte se na ně: dotaz se stejným WHERE ukáže přesně ty řádky, kterých se změna dotkne. Když najde ty správné, předělejte SELECT … FROM zakaznici na UPDATE zakaznici SET … a WHERE nechte, jak je.
  • Kontrolujte změněné řádky. Když jste chtěli změnit jednoho zákazníka, má tam být 1. Číslo 14 znamená, že je něco špatně.
  • Použijte transakci, která umí změny vrátit. Transakce poznáte na konci této lekce.

Například Matěj Němec má nový e-mail. Nejdřív dotaz:

SELECT id, jmeno, email
FROM zakaznici
WHERE id = 8;
idjmenoemail
8Matěj Němecmatej.nemec@mail.cz

Najde jeden řádek, ten správný, takže jeho WHERE může do UPDATE přejít beze změny:

UPDATE zakaznici
SET email = 'matej@nemec.cz'
WHERE id = 8;

WHERE také může najít jiné řádky, než jste chtěli: víc (AND má přednost před OR a LIKE '%an%' najde víc jmen, než byste čekali), nebo žádný (= NULL nenajde nikdy nic). SELECT se stejným WHERE vám to všechno ukáže dřív, než vznikne nějaká škoda.

Pokyny

Spusťte soubor. První UPDATE nemá WHERE: na kartě Výsledky stojí Změněné řádky: 30 a první dotaz ukazuje všechny objednávky jako vrácené. Než ho opravíte, najděte řádek, který má změnit: úplně nahoru do souboru napište dotaz, který ukáže ID, zákazníka a datum objednávek zákaznice 3 ze dne 2025-03-03. Měl by najít jen jednu:

idzakaznik_iddatum
1732025-03-03

Teď toto WHERE přidejte do prvního UPDATE. Změní 1 řádek a první dotaz na konci ukáže jen tři vrácené objednávky:

idzakaznik_iddatumstav
762024-06-01vraceno
1732025-03-03vraceno
1882025-03-28vraceno

Druhý UPDATE má zlevnit akční hry a RPG dražší než 900 Kč, což jsou tři hry, ale změní 6 řádků. Vyzkoušejte jeho WHERE v dotazu, zjistěte, proč najde víc her, a opravte ho. Poslední dotaz pak má ukázat:

nazevzanrcena
Robot RebellionAkční899
Shadow NinjaAkční649
Star PilotsAkční899
Zombie TownAkční799
Dragon ForgeRPG899
Knight's OathRPG1499

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

5/9