Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Lekce 2 - MySQL krok za krokem: Vytvoření databáze a tabulky

MySQL MySQL krok za krokem: Vytvoření databáze a tabulky

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, MySQL krok za krokem: Úvod do MySQL a příprava prostředí, jsme si řekli něco o relačních databázích a připravili jsme si prostředí. Dnes si vytvoříme databázi a do ní nějakou tabulku.

Vytvořme si databázi, obvykle nám pro jeden projekt (web) postačí jedna databáze.

Klikněme v phpMyAdmin nahoře na záložku Databáze. Vyplníme název databáze (např. databaze_pro_web). V databázích je zvykem pojmenovávat položky bez diakritiky, malými písmeny a s podtržítkovou notací. Snad vám je jasné, proč není diakritika dobrý nápad, za velkými a malými písmeny je Linux, který je rozlišuje a většina serverů právě na Linuxu běží. Porovnávání nastavíme na utf8_czech_ci (pro slovenštinu utf8_slovak_ci). Je velmi dobrý nápad nastavit databázi právě na toto standardní kódování. I kdyby samotná aplikace, která s databází komunikuje, používala jiné kódování, lze ho později snadno vynutit a data budou poté databází do tohoto kódování převáděna. Stejně ale většinou budeme používat utf8 i v naší aplikaci, která s databází komunikuje. Potvrdíme.

Vytvoření MySQL databáze

Tento krok za nás již na webhostingu téměř vždy udělali a dostaneme k dispozici často právě jednu databázi, která se jmenuje stejně, jako náš účet (tedy třeba něco jako mojewebovastran­ka.cz1). Máme vše připraveno k tomu, abychom se mohli začít učit jazyk SQL.

Jazyk SQL

SQL označuje Structured Query Language, tedy strukturovaný dotazovací jazyk. SQL je tzv. jazyk deklarativní. Zatímco u imperativních jazyků počítači vlastně říkáme krok po kroku co má udělat, u jazyků deklarativních pouze říkáme co má být výsledkem a již nás nezajímá, jak tohoto výsledku počítač dosáhne. Díky tomu jsou databázové dotazy zjednodušeny na příkaz typu "Vrať mi 10 uživatelů s nejvyšším hodnocením". Databáze takový dotaz pochopí, rozloží si ho na nějaké své instrukce a tak jej zpracuje. Nám poté opravdu vrátí výsledek, aniž bycom tušili, jak k němu došla. Pokud vám příkaz přišel jako nadsázka, tak tomu tak není a příkazy opravdu takto vypadají. Jen jsou anglicky.

SQL se původně jmenovalo SEQUEL (Structured English Query Language) a vzniklo v laboratořích společnosti IBM s cílem vytvořit jazyk, kterým by se dalo komunikovat s databází jednoduchou angličtinou. SQL (relační) databáze se poté rozšiřovaly a ujaly. Dnes se prakticky nic jiného nepoužívá a i když má SQL v objektovém programování značné nevýhody, firmám se nechce přecházet na nic jiného (i když existují alternativní řešení). Ale to jsme odbočili.

Naklikáním databáze nám phpMyAdmin vygeneroval a spustil příkaz v SQL, který vytvořil novou databázi. Vypadal by asi takto:

CREATE DATABASE `databaze_pro_web` CHARACTER SET utf8 COLLATE utf8_czech_ci;

Veškeré příkazy, které phpMyAdmin vygeneruje, si můžete zobrazit, pokud dole v okně kliknete na tlačítko "Konzole".

Části CREATE DATABASE asi rozumíme, CHARACTER SET nastavuje znakovou sadu, COLLATE tzv. porovnávání. Znaková sada je soubor znaků, které může databáze obsahovat, porovnávání se většinou váže ke znakové sadě a určuje, jak se znaky za sebe řadí, tedy české "Č" je po "C" a tak dále. Oboje nastavíme na UTF8, u porovnávání upřesníme, že chceme češtinu (případně slovenštinu).

V SQL se většinou píší příkazy velkými písmeny, to proto, že je to lépe odliší od zbytku dotazu nebo od kódu naší aplikace (např. v PHP). Názvy tabulek, sloupců a další identifikátory jsou naopak malými písmeny a podtržítkovou notací. Je dobrým zvykem je vkládat mezi zpětné apostrofy (na QWERTY klávesnici AltGt + klávesa pod escape, na anglické jen ta klávesa).

Zkuste si databázi odstranit (ikona Domečeku v levém panelu -> záložka Databáze -> zaškrtnout políčko u databaze_pro_web a Odstranit).

Odstranění MySQL databáze

Databáze zmizela a vidíme, že nám phpMyAdmin vygeneroval další dotaz (většinou nám ho po kliknutí ukáže), který zněl:

DROP DATABASE `databaze_pro_web`;

"Zahoď databázi databaze_pro_web", zde asi není co dodávat. Už umíme 2 SQL příkazy, vytvoření databáze a její odstranění. Ani jeden ale v naší aplikaci asi používat nebudeme, protože databázi si stačí vytvořit jen jednou a můžeme to udělat takto jednoduše v administračním nástroji. To samé platí pro tvorbu tabulek. Teprve samotná práce s daty v SQL pro nás bude klíčová, brzy se k ní dostaneme.

Spuštění SQL dotazu

Nyní si databázi opět vytvořme, ale místo nakliknutí zadáme rovnou SQL dotaz. V horní liště klikneme na položku SQL. Otevře se nám okno, kam můžeme psát přímo SQL dotazy. Vložíme tam náš dotaz pro vytvoření databáze (viz výše) a dotaz provedeme:

SQL dotaz v phpMyAdmin

Vidíme, že jsme docílili stejného výsledku, jako když jsme tabulku naklikli. Databázi si v levém sloupci otevřete. phpMyAdmin nám nabízí vytvoření tabulky. Vzpomeneme si na příklad tabulky uživatelů, co jsme si ukázali v minulém dílu. Měla sloupce jméno, příjmení, datum narození a počet článků. Již jsme nakousli, že by každá tabulka měla mít sloupec, jehož hodnota je pro každou položku unikátní. Sloupců bude tedy dohromady 5, tabulka se bude jmenovat uzivatele. Hodnoty zadejme do phpMyAdmina:

Vytvoření tabulky v phpMyAdmin

Otevře se nám opravdu hodně polí, ale těch se vůbec nelekejte. První sloupec jsou jména sloupců tabulky. Vyplníme pod sebe tedy názvy našich sloupců, což jsou: uzivatele_id, jmeno, prijmeni, datum_narozeni, a pocet_clanku. Id se mi osvědčilo pojmenovávat s prefixem tabulky, ale není to nutné.

Přesuňme se k 2. sloupci, kde jsou datové typy jednotlivých sloupců tabulku. Přednastavený máme INT, což jsou celá čísla. Typů je opravdu mnoho, ale my si dlouho (asi až do konce seriálu) vystačíme jen s několika. uzivatele_id ponecháme na INT, jmeno a prijmeni nastavíme na VARCHAR, to je krátký text. Datum narození na DATE. Poslední, pocet_clanku, bude typu INT. Časem si popíšeme i další datové typy, ale teď vám s nimi nebudu motat hlavu :)

3. sloupec Délka/množina má smysl jen u VARCHARU a udává maximální počet jeho znaků, jméno i příjmení nastavíme na 60 znaků.

Od verze MySQL 5.7 je důležité si dávat pozor na 4. sloupec "Výchozí". Pokud jste ve starších verzích při vkládání dat do tabulky nezadali data pro všechny sloupce, MySQL automaticky vložila nějakou výchozí hodnotu. V nových verzích spadne s chybovým stavem: Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'xxx' doesn't have a default value a dotaz se neprovede. Pokud tedy vytváříte sloupec, který nemusí mít vždy zadanou hodnotu, je vhodné mu nastavit nějakou výchozí. Všimněte si, že v našem případě nemusí být při vkládání nového uživatele zadán počet jeho článků právě proto, že výchozí hodnota je nastavena na NULL, která označuje nezadáno.

Dále máme další sloupce, které pro nás však nejsou tak důležité a nebudeme je vyplňovat. Poslední, co vyplníme, je sloupec Klíč u sloupce s uzivatele_id. Klíč zde nastavíme na PRIMARY a zaškrtneme pole vedle, které je nadepsáno A_I (jako Auto Increment). Tímto jsme sloupec uzivatele_id nastavili jako tzv. primární klíč tabulky. Klíče (někdy indexy) nám umožňují identifikovat položku v tabulce. Takový primární klíč by měla mít každá tabulka (i když teoreticky nemusí). Když budeme chtít uživatele např. vymazat, vymažeme ho podle tohoto klíče (tedy podle uzivatele_id). Kdybychom ho mazali podle jména, smazali bychom několik položek, protože třeba Janů Nováků tam může být více. Podle uzivatele_id vymažeme vždy jen toho jednoho. Zaškrtnutí Auto Increment způsobilo, že se bude hodnota uzivatele_id automaticky navyšovat a uživatelé se budou postupně číslovat.

Mimochodem, všimněte si možnosti Přidat pole, to je pokud jich na začátku zadáme málo a při návrhu tabulky zjistíme, že potřebujeme další. Tabulku uložíme.

Vytvoření tabulky v phpMyAdmin

Tabulka se nám objeví v levém sloupci, můžeme ji rozkliknout, ale zatím je prázdná. SQL dotaz pro vytvoření tabulky by vypadal takto:

CREATE TABLE uzivatele (
  uzivatele_id int AUTO_INCREMENT,
  jmeno varchar(60),
  prijmeni varchar(60),
  datum_narozeni date,
  pocet_clanku int,
  PRIMARY KEY (uzivatele_id)
);

První řádek je jasný, na dalších řádcích se definují jednotlivé sloupce tabulky a jejich datový typ. U varchar k typu uvedeme i počet znaků. AUTO_INCREMENT u uzivatele_id označuje, aby databáze každému novému uživateli přiřadila o 1 větší ID, než měl poslední. Nakonec nastavíme uzivatele_id jako primární klíč tabulky.

Odstranění tabulky je stejné, jako odstranění databáze. V phpMyAdmin ji odstraníte po rokliknutí příslušné databáze, v SQL:

DROP TABLE `uzivatele`;

Zkuste si tabulku dropnout a poté znovu vložit pomocí SQL dotazu. V příští lekci, MySQL krok za krokem: Vkládání a mazání dat v tabulce, si ji již naplníme nějakými daty :)


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
35 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (6)

 

 

Komentáře
Zobrazit starší komentáře (35)

Avatar
Libor Šimo (libcosenior):23.2.2014 12:09

Díky, teda pre mňa bude najvhodnejšie utf8_slovak_ci.

Odpovědět 23.2.2014 12:09
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:18.3.2014 11:38

Špatně to není, plurál se v DB tabulkách běžně používá, dělá to tak třeba Microsoft. Je to úplně jedno.

Odpovědět 18.3.2014 11:38
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
jip123
Člen
Avatar
jip123:20.9.2014 17:30

Na qwertz klávesnici nemůžu najít výše zmíněný "zpětný apostrof". Zná někdo klávesovou zkratku?

 
Odpovědět  +1 20.9.2014 17:30
Avatar
IT Man
Redaktor
Avatar
Odpovídá na jip123
IT Man:20.9.2014 18:26

Levý ALT + 96. :-)

Odpovědět 20.9.2014 18:26
Cokoliv a kdokoliv může jednou uspět.
Avatar
youtubak777
Člen
Avatar
youtubak777:23.4.2015 20:54

Ahoj, jaký typ je nejlepší pro uložení IP adresy?

 
Odpovědět 23.4.2015 20:54
Avatar
Odpovědět  +1 23.4.2015 20:55
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jakub Mikšík:7. června 15:35

Ahoj, asi hloupý dotaz, ale nemůžu najít nikde A_I (Auto Increment). Koukám do toho už 10 minut. Poradí mi někdo prosím? Kdybych to nezatrhnul, tak předpokládám, že to budu muset vyplňovat ručně při zakládání každého uživatele, že? Jinak děkuji za skvělý článek. Hlavně první díl, zprovoznění XAMPP. Díky a hezký den. Jakub

Editováno 7. června 15:36
 
Odpovědět 7. června 15:35
Avatar
Odpovídá na Jakub Mikšík
Michal Štěpánek:7. června 19:49

Předpokládáš sice správně, ale radši to nedělej, protože s Primary Key bez AutoIncrement si přiděláš spíš starosti, než abys toho mohl k něčemu využít...

Odpovědět 7. června 19:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Jakub Mikšík:8. června 9:49

To si uvědomuji, ale primárně jsem psal, že ten autoincrement nedokážu najít, kde ho zapnout/aktivovat. Nikde jsem ho prostě nenašel. Jde aktivovat případně i zpětně? díky

 
Odpovědět 8. června 9:49
Avatar
Odpovídá na Jakub Mikšík
Michal Štěpánek:8. června 10:08

třeba takhle

ALTER TABLE nazev_tabulky CHANGE id id INT(10) NOT NULL AUTO_INCREMENT;
Odpovědět  +1 8. června 10:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 45. Zobrazit vše