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.

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:

idnazev
19Mystery 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:

idjmeno
8Matěj Němec
10Vojtě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:

objednavkypolozkyrecenze
294124

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

6/9