✏️ Tvorba tabulek a změna dat

Stavba tabulky

O čem to je

Než nalije truhlář do formy lepidlo, musí formu postavit: určit rozměry a z jakého materiálu bude. U databáze je to stejné. Než do tabulky uložíš první řádek, musíš ji vytvořit: říct, jaké má sloupce, jakého typu a jaká pravidla musí data splňovat.

Část SQL, která vytváří a mění strukturu databáze, se jmenuje DDL. Dobře nastavená pravidla ušetří spoustu chyb: databáze sama odmítne nesmyslná data.

Nové pojmy

DDL (Data Definition Language)Příkazy SQL pro definici struktury: CREATE (vytvoř), ALTER (změň), DROP (smaž celý objekt).CREATE TABLE zaci (…);
Datový typ sloupceUrčuje, jaké hodnoty sloupec smí obsahovat a kolik místa zaberou.INT celé číslo, VARCHAR(50) text do 50 znaků.
Integritní omezení (constraint)Pravidlo, které SŘBD hlídá při každém zápisu. Když ho data porušují, zápis odmítne.NOT NULL: hodnota nesmí chybět.
Primární a cizí klíčPřipomenutí: primární klíč (PRIMARY KEY) jednoznačně určuje řádek. Cizí klíč (FOREIGN KEY … REFERENCES …) odkazuje na primární klíč jiné tabulky.id_tridy v tabulce žáků odkazuje na tabulku tříd.

Běžné datové typy

TypNa coPříklad
INTcelé číslopočet kusů
DECIMAL(8, 2)přesné desetinné číslo: 8 číslic, z toho 2 za čárkoucena 123456.78
VARCHAR(n)text proměnné délky, nejvýš n znakůjméno
CHAR(n)text pevné délky nkód státu „CZ“
DATEdatum, zapisuje se '2025-09-01'datum narození
BOOLEANpravda/nepravda (ne každý SŘBD ho má)aktivní účet

Omezení

OmezeníCo hlídá
PRIMARY KEYjedinečnost a NOT NULL klíče
NOT NULLhodnota nesmí chybět
UNIQUEhodnota se ve sloupci nesmí opakovat
DEFAULT xkdyž hodnotu nezadáš, použije se x
CHECK (podmínka)hodnota musí splnit podmínku
FOREIGN KEY … REFERENCES …hodnota musí existovat v odkazované tabulce

Vytvoření tabulek

  • CREATE TABLE tridy (
  •     id INT PRIMARY KEY,
  •     nazev VARCHAR(10) NOT NULL UNIQUE
  • );
  •  
  • CREATE TABLE zaci (
  •     id INT PRIMARY KEY,
  •     jmeno VARCHAR(50) NOT NULL,
  •     email VARCHAR(100) UNIQUE,
  •     rok_narozeni INT CHECK (rok_narozeni > 1990),
  •     id_tridy INT NOT NULL,
  •     FOREIGN KEY (id_tridy) REFERENCES tridy(id)
  • );

Tabulku tridy musíš vytvořit dřív. Cizí klíč může odkazovat jen na tabulku, která už existuje.

Jaký datový typ zvolíš pro cenu zboží v Kč s haléři?
`DECIMAL(10, 2)`. Je přesný. Typy FLOAT a REAL ukládají čísla přibližně a u peněz by vznikaly zaokrouhlovací chyby.
Přidej do tabulky žáků sloupec telefon a pak smaž tabulku kroužků.
ALTER TABLE zaci ADD telefon VARCHAR(20); přidá sloupec (u existujících řádků bude NULL). DROP TABLE krouzky; smaže tabulku i se všemi daty, bez možnosti vrácení.
✗PSČ uložím jako INT, je to přece číslo.
✓PSČ ulož jako text, např. CHAR(5) nebo VARCHAR(6).

S PSČ se nepočítá. Navíc čísla ztrácejí úvodní nuly a nepojmou mezeru („110 00“). Totéž platí pro telefonní čísla.

DDL vytváří a mění strukturu: CREATE TABLE, ALTER TABLE, DROP TABLE. Každý sloupec má datový typ. Omezení (PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, CHECK, FOREIGN KEY) brání uložení nesmyslných dat.

Změny dat

O čem to je

Do školy nastoupí nový žák, jiný se přestěhuje a další odejde. Tabulky už existují, mění se jen jejich obsah. Na to slouží tři příkazy: INSERT, UPDATE a DELETE.

Jsou jednoduché, ale nebezpečné. Jedna zapomenutá podmínka a změníš nebo smažeš data celé školy. Proto se naučíš i to, jak se tomu bránit.

Nové pojmy

Tabulka a omezeníPřipomenutí: tabulka má pevné sloupce s datovými typy. Omezení (NOT NULL, UNIQUE, cizí klíč…) SŘBD kontroluje při každé změně dat.Vložení žáka bez povinného jména SŘBD odmítne.
DML (Data Manipulation Language)Příkazy SQL pro práci s daty: SELECT (čti), INSERT (vlož), UPDATE (změň), DELETE (smaž).INSERT INTO zaci …
INSERT INTO … VALUES …Vloží nový řádek. Za jménem tabulky vyjmenuj sloupce, za VALUES hodnoty ve stejném pořadí.INSERT INTO zaci (id, jmeno, id_tridy) VALUES (6, 'Adam', 2);
UPDATE … SET … WHERE …Změní hodnoty ve sloupcích u řádků, které splní podmínku WHERE.UPDATE zaci SET id_tridy = 3 WHERE id = 6;
DELETE FROM … WHERE …Smaže řádky, které splní podmínku.DELETE FROM zaci WHERE id = 6;

Bez WHERE to platí pro všechno

PříkazS WHERE id = 6Bez WHERE
UPDATE zaci SET id_tridy = 3změní třídu jednomu žákovipřesune do třídy 3 všechny žáky
DELETE FROM zacismaže jednoho žákasmaže všechny žáky

Bezpečný postup změny

Nejdřív napiš SELECT se stejnou podmínkou: SELECT * FROM zaci WHERE id = 6;
Zkontroluj, že vrací přesně ty řádky, které chceš změnit.
Teprve pak SELECT * nahraď za UPDATE … SET … nebo DELETE.
U důležitých dat pracuj v transakci, ať jde změnu vrátit (viz téma Transakce).

Cizí klíč a mazání

Když smažeš třídu, na kterou odkazují žáci, porušil bys referenční integritu. U cizího klíče proto určíš, co se má stát:

Volba u FOREIGN KEYCo se stane se žáky při smazání jejich třídy
ON DELETE RESTRICT / NO ACTIONsmazání třídy SŘBD odmítne (výchozí chování)
ON DELETE CASCADEsmažou se i žáci té třídy
ON DELETE SET NULLžákům se id_tridy nastaví na NULL
Zdraž všechno zboží v kategorii 4 o 10 %.
UPDATE zbozi SET cena = cena * 1.1 WHERE id_kategorie = 4; Nová hodnota se smí počítat ze staré. WHERE omezí změnu jen na kategorii 4.
Vlož dva žáky jedním příkazem.
INSERT INTO zaci (id, jmeno, id_tridy) VALUES (7, 'Bára', 1), (8, 'Ondřej', 2); Každá závorka za VALUES je jeden řádek. Sloupce, které nevyjmenuješ, dostanou DEFAULT, nebo NULL.
✗DELETE FROM zaci; smaže tabulku zaci.
✓DELETE FROM zaci; smaže všechny řádky, tabulka zůstane prázdná. Tabulku i se strukturou smaže až DROP TABLE zaci;.

DELETE patří do DML (data), DROP do DDL (struktura).

INSERT vkládá řádky, UPDATE … SET je mění, DELETE je maže. Bez WHERE se UPDATE i DELETE týká všech řádků, proto podmínku nejdřív vyzkoušej v SELECT. ON DELETE u cizího klíče určí, co se stane s odkazujícími řádky.