V předchozích dílech jsem vám představoval MySQL převážně v teoretické a tudíž ne moc záživné formě. Vzhledem k tomu, že toho bylo již dost, tak je myslím na čase, podívat se trochu více na praxi - konkrétně na tvorbu tabulek.
V jednom z předchozích dílu jsem vám ukazoval, jakým způsobem se v MySQL vytvoří databáze. Databáze je základním stavebním prvkem v MySQL a je vždy reprezentována příslušným podadresářem v adresáři Data (pod Windows). Seznam těchto databází získáte pomocí již dříve zmíněného příkazu
show databases, který zadáte v MySQL Monitoru. Každá jednotlivé databáze se skládá z tabulek a o těch je celý dnešní díl.
Tabulka se v MySQL vytváří pomocí SQL příkazu
create.
Jeho syntaxe je dána standardem ANSI SQL92, což je standard pro jazyk SQL a MySQL se jim řídí. Základní syntaxe příkazu
create vypadá následovně:
create [temporary] table [if not exists] název_tabulky [(definice poli,...)] [možnosti tabulky] [výběrový příkaz]
Tak takhle vypadá syntaxe příkazu create v SQL. Pokud se vám toto zdá dosti nepřehledná, tak nezoufejte, hned to vysvětlím do trochu srozumitelnější formy. Daný příkaz se skládá z tzv.. povinných častí tj. takových, které musíte uvést vždy a takových, které jsou nepovinné a jsou uvedeny v hranatých závorkách. Nejprimitivněji zadaný příkaz create vypadá například následovně:
create table cisla (id int);
Většina tabulek začíná syntaxí create table, která je povinná, následována názvem tabulky (v tomto případě „cisla“) a na závěr v závorkách naleznete seznam nadefinovaných polí (s přiděleným datovým typem), které jsou od sebe odděleny čárkami. Celý příkaz se, podobně jaké jiné příkazy v MySQL monitoru, ukončuje středníkem. Po následném odeslání příkazu SQL serveru se, pokud jste neudělali žádnou chybu v syntaxi, vypíše něco jako „Query OK, 0 rows affected (0.12 sec)“. V opačném případě se vypíše chybová hláška.
(Poznámka: Definice polí sice není povinná, ale to jen v tom případě, že při tvorbě tabulky využijeme nepovinnou část [výběrový příkaz] - viz. dále. V jiných případech je nutné ji použít, protože tabulka bez polí (tudíž i bez možnosti uložit data) je nesmysl.)
Nepovinná část příkazu [temporary] umožňuje vytvářet dočasnou tabulku, která se automaticky smaže po odpojení uživatele od databázového serveru. Tuto část využijete velmi zřídka. Většinou se totiž využívá jen u náročných operací, kde se pracuje s velkým množstvím dat. Daleko častěji však využijete část [if not exists], která je jakousi podmínkou existence tabulky. Pokud si tedy nejste třeba jisti, zda-li tabulka již existuje, pak použijte tuto nepovinnou pasáž a máte vyhráno. Toto zejména využijete u koncových aplikacích, která využívající MySQL a kde je snaha možnost chyby minimalizovat. Syntaxe může vypadat následovně:
create table if not exists cisla (id int);
Pokud tabulka neexistuje, pak bude vytvořena. V opačném případě se ovšem nic nestane a žádnou chybu to nezpůsobí.
Další užitečnou částí jsou [možnosti tabulky], kde můžeme nadefinovat zbývající možnosti tabulky jako je například volba typu tabulky, přidání komentáře, nastavení hesla... apod. První zmíněná možnost tj. změna typu tabulky se může stát někdy užitečná. Pro úplnost zmíním jednotlivé typy:
Typ |
Popis |
BDB či Berkeley_db |
tento typ je vhodné využít v případě, že potřebujete využít transakční zpracování. Můžete jej využít od verze 3.23.34. |
HEAP |
tento typ je dostupný pouze pro dočasné tabulky vytvářené v paměti. |
ISAM |
původní typ tabulky, který se již moc nevyužívá, protože typ MyISAM je vhodnější. |
InnoDB |
pomocí tohoto typu můžete taktéž využít transakční zpracování. Je dostupný od verze 3.23.34a. |
MERGE |
pomocí tohoto typu můžete ukládat MyISAM tabulky do jednoho souboru |
MyISAM |
implicitní typ tabulky, který nastoupil od verze 3.23.xx. |
Výše vypsaný seznam typů tabulek je pouze orientační. Pokud se rozhodnete využít jiný typ než implicitní MyISAM (většinou není důvod měnit), pak podrobnější informace o daném typu naleznete v manuálu. Změnu typu provedete takto:
create table nova_tabulka (id int, popis text) type=BDB;
Předcházející příkaz vytvoří tabulku u které je její implicitní typ MyISAM změněn na BDB. V případě, že BDB či jiný typ není v distribuci MySQL k dispozici, tak se namísto toto dosadí implicitně MyISAM. Jak jsem již zmínil dříve, tak MySQL disponuje ještě dalšími možnostmi, kterými umožníte určitou změnu chování tabulky. Kompletní výčet jsem sepsal v následující tabulce:
Možnost |
Popis |
AUTO_INCREMENT = X |
možnost nadefinování automatického čísla. Toto číslo bude přibližně o 10% rychlejší než to samé, které je uvedeno přímo v tabulce. Nutno uvést počáteční hodnotu. (MyISAM) |
AVG_ROWS_LENGTH = X |
pomocí tohoto nastavíte délku řádky v tabulce. Tato tabulka však musí obsahovat pole proměnné délky. Tuto možnost využijete zejména u rozsáhlých tabulek. |
CHECKSUM = 1 či 0 |
v případě, že nastavíte tuto možnost na 1, pak získáte lepší možnost opravy v případě poškození tabulky. Nevýhodou však je trochu nižší rychlost takto vytvořené tabulky. (MyISAM) |
COMMENT=`komentář` |
umožňuje k tabulce přiložit komentář. |
MAX_ROWS = X |
definuje maximální počet řádků, které lze v tabulce uložit. Nastavením této možnosti může zvýšit rychlost. |
MIN_ROWS = X |
pravý opak předchozí možnosti. Taktéž může zvýšit rychlost. |
PACK_KEYS = 1 či 0 |
pokud tuto možnost nastavíte na 1, pak docílíte zmenšení a zrychlení indexů - ovšem za cenu pomalejších aktualizačních dotazů (MyISAM, ISAM). |
PASSWORD = `heslo` |
zaheslování tabulky (konkrétně souboru *.frm) |
DELAY_KEY_WRITE = 1 či 0 |
celkem zajímavá možnost, jak zajistit to, aby se aktualizovala tabulka jen v tu dobu, kdy s ní nebude nikdo pracovat (MyISAM). |
ROW_FORMAT = default, dynamic, static či compressed |
určuje způsob uložení polí v tabulce. Běžně využijete dynamic či static (MyISAM). Tuto možnost využijete zřídka. |
Jak vidíte, tak dostupných možností je vcelku dost. Je tedy na vás, zda-li se pro některou rozhodnete či nikoliv. Pro snazší pochopení použiji následující příklady:
create table dalsi_tabulka (id int, popis text) comment=`toto je komentář k tabulce`;
create table posledni_tabulka (id int, popis text) comment=`a další komentář` max_rows=30;
Poslední nepovinnou částí příkazu create je tzv. [výběrový příkaz]. Touto možností můžete vytvořit novou tabulku, která bude obsahovat data z jiné, již dříve definované, tabulky. Příklady:
create table uzivatele select * from mysql.user;
create table uzivatele1 select * from user;
První zmíněný příkaz vytvoří tabulku uzivatele, která bude totožná s tabulkou user a která se navíc nachází v jiné databázi. Druhý příklad ukazuje, jak se to samé děje v případě, že pracujete pouze uvnitř jedné databáze. Pokud teď nerozumíte výběrovému dotazu select * from user, pak nezoufejte! Tomuto SQL příkazu bude věnována jedna z následujících kapitol. Prozatím jen to, že tento dotaz vybere všechna data z tabulky (včetně nadefinovaných polí) a zkopíruje je do tabulky nové, v tomto případě uzivatele resp. uzivatele1. Tento příkaz lze samozřejmě zadat daleko složitější a vybrat jím jen některá data či pole, ale o tom bude řeč až v samostatné kapitole.
Aby jsem toto vše alespoň trochu shrnul, tak na závěr vytvořím trošku složitější tabulku:
create table if not exists seznam_uzivatelu
(id int primary key not null auto_increment,
jmeno char (20),
prijmeni char (20),
adresa char (50),
vek tinyint)
comment=`seznam uzivatelu`;
Tato tabulka se vytvoří v případě, pokud neexistuje (if not exists). Tabulka bude mít pole ID, které bude sloužit k jednoznačné identifikaci jednotlivých záznamu a které bude primárním klíčem, bude muset být zaplněné a při každém novém záznamu se do tohoto pole vloží vždy číslo o jedno vyšší, než bylo kdy použito v této tabulce. Zbytek nadefinovaných polí je myslím jasný a na závěr byl k tabulce připojen komentář.
Ohledně tvorby tabulek by to bylo pro dnešek vše. Příště vám povím něco o úpravě a rušení tabulek při použití příkazu
alter table respektive
drop table.