Změna dat
Zatím jsme se databáze jen ptali. Data můžeme upravovat třemi příkazy:
INSERTpřidává nové řádky,UPDATEmění existující řádky,DELETEmaže.
Vložení / INSERT
INSERT INTO customers (name, email, city, registered_at)
VALUES ('Karolína Malá', 'karolina.mala@example.cz', 'Praha', '2026-10-22');Za názvem tabulky vyjmenujeme sloupce a za VALUES jejich hodnoty ve stejném pořadí. Sloupec id vynecháme, primární klíč přidělí databáze sama a vezme další volné číslo.
Datum zapisujeme jako text ve tvaru RRRR-MM-DD. SQLite pro datum nemá vlastní typ, a v tomto tvaru se data řadí a porovnávají správně i jako text.
Že zápis prošel, si ověříme dotazem:
SELECT * FROM customers WHERE email = 'karolina.mala@example.cz';Databáze si přitom hlídá pravidla ze schématu. E-mail má v tabulce podmínku UNIQUE, takže kdybychom se pokusili vložit druhého zákazníka se stejnou adresou, databáze nás odmítne s chybou:
UNIQUE constraint failed: customers.emailÚprava / UPDATE
UPDATE customers
SET city = 'Brno'
WHERE id = 4;SET říká, jaké sloupce nastavujeme na jakou hodnotu. WHERE určuje, kterých řádků se to týká.
Pokud bychom neuvedli žádnou podmínku do WHERE, změnili bychom město na Brno ve všech řádcích tabulky. Na to pozor!
Nová hodnota se dá i spočítat ze staré. Když se prodá jeden pár bot Old Skool, ubereme ho ze skladu:
UPDATE products
SET stock = stock - 1
WHERE id = 4;Smazání / DELETE
DELETE FROM customers
WHERE id = 15;Smaže řádky, které splní podmínku. Tady jednoho zákazníka, který se zaregistroval a nic nestihl objednat.
I zde platí, že když neuvedeme nic do WHERE, smažeme všechny řádky v tabulce.
Zapomenuté WHERE
-- chyba, smaže všechny zákazníky
DELETE FROM customers;WHERE je u UPDATE i DELETE nepovinné. Bez něj se příkaz týká každého řádku tabulky a databáze se nijak nezeptá, jestli to tak myslíme. Totéž platí pro UPDATE bez podmínky, který přepíše všem zákazníkům město na Brno.
V praxi je proto dobrým zvykem před každým UPDATE a DELETE nejdřív spustit SELECT se stejnou podmínkou. Když vrátí přesně ty řádky, které chceme změnit, přepíšeme SELECT * na UPDATE nebo DELETE a podmínka zůstane.
V naší ukázkové databázi je tlačítko Obnovit databázi. Ve skutečné databázi to není tak jednoduché a pokud nemáte zálohu, o data jste nenávratně přišli.
Mazání a cizí klíč
V minulé lekci jsme si slíbili, že si vyzkoušíme, jak se databáze zachová při mazání řádku, na který odkazuje cizí klíč. Takhle jsou v naší databázi zapsané objednávky a jejich položky:
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers (id),
...
);
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders (id) ON DELETE CASCADE,
...
);Co se stane, když smažeme zákazníka, který má objednávky? A co objednávku, která má položky?
DELETE FROM customers WHERE id = 1;
-- výsledek ???
DELETE FROM orders WHERE id = 101;
-- výsledek ???Databáze buď odmítne smazání, nebo smaže i závislé řádky, nebo vymaže odkaz na smazaná data. My máme databázi nastavenou tak, že smazání odmítne.
SQLite má kontrolu cizích klíčů ve výchozím stavu vypnutou. Lze tedy smazat zákazníka, i když má v databázi objednávky. Kontrola se musí zapnout vždy po každém připojení k databázi příkazem PRAGMA foreign_keys = ON;
Naše stránka s databází to dělá za vás. Kdo ale pracuje s SQLite v jiném nástroji, musí na to myslet.