Hledáme fulltime PHP programátora do ITnetwork týmu - 100% homeoffice, 100% časově flexibilní #bezdeadlinu Mám zájem!
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Discount week 50

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

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".

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Čá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 databázi naplníme nějakými daty :)


 

Předchozí článek
MySQL krok za krokem: Úvod do MySQL a příprava prostředí
Všechny články v sekci
MySQL/MariaDB databáze krok za krokem
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
47 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (11)

 

 

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

Avatar
Jakub Mikšík:7.6.2018 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.6.2018 15:36
 
Odpovědět
7.6.2018 15:35
Avatar
Odpovídá na Jakub Mikšík
Michal Štěpánek:7.6.2018 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.6.2018 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.6.2018 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.6.2018 9:49
Avatar
Odpovídá na Jakub Mikšík
Michal Štěpánek:8.6.2018 10:08

třeba takhle

ALTER TABLE nazev_tabulky CHANGE id id INT(10) NOT NULL AUTO_INCREMENT;
Odpovědět
8.6.2018 10:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Richard Hlubuček:18.2.2020 10:59

Zdravím, jenom pro jistotu, nechybí v kódu uvedeném před koncem článku oštření NOT NULL, popřípadě NULL DEFAULT NULL pro nepovinné pole pocet_clanku? → viz poznámka o potřebě vyplňovat sloupec výchozí od MySQL v5.7.
Díky :-)

CREATE TABLE uzivatele (
  uzivatele_id int AUTO_INCREMENT,
  jmeno varchar(60),
  prijmeni varchar(60),
  datum_narozeni date,
  pocet_clanku int,
  PRIMARY KEY (uzivatele_id)
);
Odpovědět
18.2.2020 10:59
I have no name, I am but two days old.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Pavel Kubalík:27.9.2020 16:33

Dobrý den
Tak se stalo co jsem nechtěl. Studuji MySQL.
Absolvoval jsem kurz SQLite a chtěl jsem studovat PostgreSQL, ale nepodařilo se mi stáhnout soubor z internetu. Požadovalo to registraci, což jsem se snažil a bohužel. Stránka prý neexistuje. Asi to tak Pánbůh chtěl, a tak studuji MySQL.
Požaduje se zde trochu větší zapojení mozkových závitů než kurz SQLite, ale snad se to podá. Budu se snažit kurz dokončit a zvolit si výhodnější databázi. Zatím budu paralelně budovat svoji databázi v SQLite.
Děkuji PK

 
Odpovědět
27.9.2020 16:33
Avatar
Jan Hnilica
Člen
Avatar
Jan Hnilica:30.11.2020 13:53

ahoj, chci se jen ujistit:

  1. SQL tedy není "case sensitive"?
  2. středník za příkazem je povinný nebo ne?

Prochází mi jak "INSERT" tak "insert" a příkazy se středníkem i bez, ale nevím, jestli je to vlastnost SQL nebo jestli to za mě opravuje phpMyAdmin...
Díky Honza

 
Odpovědět
30.11.2020 13:53
Avatar
Samuel Hél
Tým ITnetwork
Avatar
Odpovídá na Jan Hnilica
Samuel Hél:10.12.2020 19:12

Ahoj, ve výchozím nastavení není SQL case sensitive. Středníky za příkazem být musí, phpMyAdmin to nejspíš opravuje. Pokud třeba zapneš MySQL konzoli, tak z mé zkušenosti vím, že enterem uděláš nový řádek, ať se příkaz lépe čte, SQL dotaz ale neodešleš, dokud nenapíšeš středník. Bez středníku vím, že funguje jen dotaz use (pro vybrání aktivní databáze).

 
Odpovědět
10.12.2020 19:12
Avatar
Josef Vacek
Člen
Avatar
Josef Vacek:8. ledna 22:49

Ahoj, nedaří se mi naklikat tabulku, hlásí mi

#1075 - Můžete mít pouze jedno AUTO pole a to musí být definováno jako klíč

pokud vložím SQL dotaz z článku pak je to OK.
Náhled SQL z phpAdmin vypadá následovně

CREATE TABLE `databaze_pro_web`.`uzivatele` (
`uzivatele_id` INT NOT NULL AUTO_INCREMENT ,
 `jmeno` VARCHAR(60) NOT NULL ,
 `prijmeni` VARCHAR(60) NOT NULL ,
 `datum_narozeni` DATE NOT NULL ,
 `pocet_clanku` INT NULL DEFAULT NULL )
ENGINE = InnoDB;

Hodnota Výchozí u pocet_clanku na výsledek vliv nemá.
XAMP jsem instaloval dnes, používám Ubuntu 20.04.
Kde se pletu, děkuji.
Pepa

 
Odpovědět
8. ledna 22:49
Avatar
Josef Vacek
Člen
Avatar
Odpovídá na Josef Vacek
Josef Vacek:18. ledna 10:20

Tak zpět, teď už to funguje bez problémů, asi slepá skvrna :-/
Pepa

 
Odpovědět
18. ledna 10:20
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 51. Zobrazit vše