Změna a smazání tabulky

Tabulky se časem mění: obchod začne sbírat nový údaj nebo se ukáže, že nějaký název není jasný. Tabulku přitom nemusíte smazat se všemi řádky a vytvořit znovu: ALTER TABLE (změň tabulku) změní tabulku, která už existuje. ADD COLUMN do ní přidá sloupec:

ALTER TABLE zakaznici
ADD COLUMN telefon TEXT;

SELECT jmeno, telefon
FROM zakaznici
LIMIT 2;
jmenotelefon
Eva NovotnáNULL
Jakub DvořákNULL

Nový sloupec se přidá na konec tabulky. Řádky, které už v tabulce jsou, v něm dostanou NULL nebo výchozí hodnotu sloupce (DEFAULT). Proto nový sloupec s NOT NULL potřebuje DEFAULT: bez něj by řádky, které už v tabulce jsou, pravidlo porušily:

ALTER TABLE zakaznici
ADD COLUMN novinky INTEGER NOT NULL;
Error on line 1: Cannot add a NOT NULL column with default value NULL

S DEFAULT 0 to projde a každý zákazník dostane 0. RENAME COLUMN přejmenuje sloupec a RENAME TO celou tabulku:

ALTER TABLE zakaznici
RENAME COLUMN registrace TO zalozeno;

ALTER TABLE polozky
RENAME TO polozky_objednavek;

SQLite změní název všude v databázi, třeba v cizích klíčích jiných tabulek. Dotazy v kódu aplikace ale pořád používají starý název a přestaly by fungovat, proto se ve skutečných aplikacích tabulky a sloupce přejmenovávají zřídka a opatrně. Kromě toho umí ALTER TABLE v SQLite už jen smazat sloupec (DROP COLUMN). Nedokáže změnit typ sloupce ani přidat NOT NULL, UNIQUE nebo CHECK ke sloupci, který už existuje. K tomu se vytvoří nová tabulka, jak má být, řádky se do ní zkopírují pomocí INSERT … SELECT, stará tabulka se smaže a nová dostane její název. Jiné databáze toho umějí víc.

DROP TABLE recenze; smaže tabulku se všemi řádky. Nezeptá se „Opravdu?“ a nejde to vrátit; tabulku vrátí jen ROLLBACK uvnitř transakce. Tabulku, na kterou ukazují cizí klíče jiných tabulek, smazat nejde, dokud na ni ukazují nějaké řádky, takže tabulky, které na ni ukazují, musí zmizet dřív:

DROP TABLE hry;
Error on line 1: FOREIGN KEY constraint failed

DROP TABLE tabulky, která neexistuje, je chyba, a stejně tak CREATE TABLE tabulky, která už existuje. Ve skriptech, které se mohou spustit víckrát, proto programátoři píšou DROP TABLE IF EXISTS (pokud existuje) a CREATE TABLE IF NOT EXISTS (pokud neexistuje): když tabulka není, nebo už je, příkaz prostě nic neudělá. Karta Tabulky dál ukazuje tabulky tak, jak s nimi cvičení začíná; vaše změny vidí jen příkazy ve vašem souboru.

Typická chyba: splést si DROP TABLE a DELETE FROM. DELETE FROM recenze; smaže všechny řádky, ale prázdná tabulka zůstane a můžete do ní vkládat nové. DROP TABLE recenze; smaže samotnou tabulku i s jejími sloupci a pravidly.

Pokyny

Obchod chystá výprodej. Přidejte do tabulky hry sloupec sleva: celé číslo, vždycky vyplněné, výchozí hodnota 0. Pak dejte závodním hrám slevu 100 Kč (pomocí UPDATE). Nakonec ukažte název, žánr a slevu závodních a logických her, seřazené podle názvu:

nazevzanrsleva
Cube LogicLogická0
Pixel RacerZávodní100
Turbo KartsZávodní100
Word QuestLogická0

Pod tím přejmenujte tabulku recenze na recenze_her a její sloupec hvezdicky na hodnoceni. Pak ukažte, kolik recenzí má každé hodnocení, ve sloupcích hodnoceni a pocet, od nejvyššího hodnocení:

hodnocenipocet
58
410
35
22

Objednávky teď za obchod přijímá platební služba, která si je ukládá ve vlastní databázi, takže tahle databáze je už nepotřebuje. Na konci souboru smažte tabulky objednavky a polozky. Obě napište s IF EXISTS (DROP TABLE IF EXISTS …), aby soubor proběhl bez chyby i v databázi, kde už nejsou. Jedna z obou tabulek ukazuje na druhou: rozmyslete si, která z nich musí jít první.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

8/10