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č:
| jmeno | mesto |
|---|---|
| Eva Novotná | Praha |
| Jakub Dvořák | Praha |
| 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
WHEREa vyzkoušejte ho vSELECT. Než řádky změníte, podívejte se na ně: dotaz se stejnýmWHEREukáže přesně ty řádky, kterých se změna dotkne. Když najde ty správné, předělejteSELECT … FROM zakaznicinaUPDATE zakaznici SET …aWHEREnechte, 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;| id | jmeno | |
|---|---|---|
| 8 | Matěj Němec | matej.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.
Jak psát:
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:
| id | zakaznik_id | datum |
|---|---|---|
| 17 | 3 | 2025-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:
| id | zakaznik_id | datum | stav |
|---|---|---|---|
| 7 | 6 | 2024-06-01 | vraceno |
| 17 | 3 | 2025-03-03 | vraceno |
| 18 | 8 | 2025-03-28 | vraceno |
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:
| nazev | zanr | cena |
|---|---|---|
| Robot Rebellion | Akční | 899 |
| Shadow Ninja | Akční | 649 |
| Star Pilots | Akční | 899 |
| Zombie Town | Akční | 799 |
| Dragon Forge | RPG | 899 |
| Knight's Oath | RPG | 1499 |
Začněte programovat zdarma
5/9