Mazání řádků: DELETE
Příkaz DELETE (smaž) maže řádky z tabulky. Anna Kučerová požádala obchod, aby odstranil její recenze:
DELETE FROM recenze
WHERE zakaznik_id = 5;Za DELETE FROM následuje tabulka a WHERE říká, které řádky se mají smazat. Na kartě Výsledky uvidíte Změněné řádky: 2, protože Anna napsala dvě recenze, a dotaz ukáže, že z 25 recenzí jich zbylo 23:
SELECT COUNT(*) AS recenze
FROM recenze;| recenze |
|---|
| 23 |
DELETE maže vždycky celé řádky, a proto nemá seznam sloupců: DELETE nazev FROM hry je chyba a DELETE * FROM hry, které můžete potkat v jiných databázích, také. Když chcete z řádku odstranit jen jednu hodnotu, použijte UPDATE: SET mesto = NULL.
A stejně jako UPDATE i DELETE bez WHERE zasáhne všechny řádky: po DELETE FROM recenze; je tabulka prázdná. Pořád existuje i se svými sloupci, ale nemá žádné řádky. WHERE proto nejdřív vyzkoušejte v SELECT, jak už víte.
Některé řádky smazat nejde. Zkuste smazat vrácenou objednávku 7:
DELETE FROM objednavky
WHERE id = 7;Error on line 1: FOREIGN KEY constraint failedŘádek tabulky polozky s objednávkou 7 na ni ukazuje svým cizím klíčem objednavka_id. Kdyby objednávka zmizela, položka by ukazovala na objednávku, která neexistuje. Před tím vás databáze chrání: odmítne smazat řádek, na který ukazuje jiný řádek (anglicky „constraint failed“, omezení nesplněno). Zpráva neříká, o který řádek jde, takže ho musíte najít sami. Zamyslete se, které tabulky mají cizí klíč do té vaší.
Řešení je smazat nejdřív řádky, které na něj ukazují, a teprve pak řádek samotný:
DELETE FROM polozky
WHERE objednavka_id = 7;
DELETE FROM objednavky
WHERE id = 7;Na pořadí záleží: nejdřív řádky, které ukazují, nakonec řádek, na který ukazují. Stejná ochrana platí i pro UPDATE: ani ten nedovolí, aby cizí klíč ukazoval na řádek, který neexistuje.
Jak psát:
Pokyny
Hra Robot Rebellion (ID 18) byla zrušena: nikdy nevyjde. Smažte ji z tabulky hry a pod tím ukažte ID a název her, které ještě nevyšly (jejich vydano je NULL), seřazené podle ID. Zbyla jen jedna:
| id | nazev |
|---|---|
| 19 | Mystery Manor |
Natálie Marková (zákaznice 9) požádala obchod, aby zrušil její účet se vším, co k němu patří. Smažte ji z tabulky zakaznici, ale nejdřív všechno, co na ni ukazuje: její recenze, její objednávky a před objednávkami jejich položky. (Její objednávky najdete na kartě Tabulky, nebo je nechte najít poddotaz.) Pak ukažte ID a jméno zákazníků s ID 8 až 10, seřazené podle ID:
| id | jmeno |
|---|---|
| 8 | Matěj Němec |
| 10 | Vojtěch Pokorný |
Nakonec se ujistěte, že nic jiného nezmizelo: ukažte v jednom řádku, kolik zbylo objednávek, položek a recenzí, jako sloupce objednavky, polozky a recenze. Každý sloupec může být poddotaz s COUNT(*) a dotaz, který nemá vlastní tabulku, nepotřebuje FROM. Oproti začátku má chybět jedna objednávka, jedna položka a jedna recenze:
| objednavky | polozky | recenze |
|---|---|---|
| 29 | 41 | 24 |
Začněte programovat zdarma
6/9