Shrnutí předchozích dílů
Volená témata článků minulých měly pokrýt několik základních postupů a objasnit některé principy. Ty sice nemají s ukládáním samotných dat na první pohled nic společného, ale jsou nutným teoretickým základem všech uživatelů databáze. Můžete sice namítat, že nebudete asi nikdy provozovat více instancí na jednom serveru nebo nepotřebuje vědět o funkci transakčního logu, jenže i z těchto pojmů budu vycházet při vysvětlování složitějších principů a postupů po zbytek seriálu. Nemám totiž v úmyslu tu popisovat jen zidealizované modelové situace, které fungují dokud něco nevyzkoušíte udělat jinak.
V této kapitole se již začneme zabývat skutečným používáním databáze pro ukládání dat. Vycházím z předpokladu, že jste již zvládli systém nainstalovat, nakonfigurovat podle potřeb jeho protokoly pro komunikaci, můžete se připojit pomocí nástroj SQL Server Management Studio (SSMS) k instanci a máte založenou databázi mojedb. Pokud ano, je čas si něco říct o základní datové struktuře databází – o tabulkách.
Tabulka
Tabulka je z pohledu relační databáze základním typem objektu pro uchování dat. Lze ji reprezentovat jako dvourozměrné pole – šířku definují sloupce a výšku řádky (stejně jako u jakékoliv běžné tabulky).
Struktura tabulky je definována sloupci. Každá tabulka musí mít minimálně 1 sloupec. Pokud do tabulky následně vložíme záznam (řádek), musíme vyplnit hodnotu všech sloupců. Každý sloupec má ve svém nastavení především jméno a datový typ, jenž musí splňovat všechny řádky (záznamy) tabulky. Nelze tedy vytvořit řádek, který má jiný počet sloupců, než je definovaný tabulkou nebo který porušuje definované datové typy konkrétních sloupců.
Za běžného fungování nejprve navrhneme nejprve strukturu tabulky – tedy definujeme sloupce. Ty následně zůstávají při běžném provozu neměnné. Pracuje se pouze s řádky (přidávání, mazání, upravování). Jen v případě potřeby změny struktury je možné sloupce i dodatečně, za určitých podmínek, modifikovat.
Nastavení jak samotné tabulky, tak jednotlivých sloupců nabízí celou řadu rozšiřujících nepovinných možností. Tím může být například vynucení jedinečnosti hodnot v rámci sloupců (v celé tabulce se nesmí nacházet více řádků se stejnou hodnotou sloupce), indexování sloupce (pro rychlé vyhledání řádku podle hodnoty), či defaultní hodnoty sloupce (tato hodnota se použije při vkládání, pokud není pro sloupec upřesněna) a podobně. Jednotlivé nastavení proberu podrobněji v dalším článku.
Praktická ukázka – návrh a založení jednoduché tabulky
Navrhneme do naší cvičné databáze tabulku uchovávající seznam zákazníků – bude se jmenovat Customer (o konvencích pojmenování objektů se zmíním v samostatném článku – pro tabulky používám PascalCase v jednotném čísle). Struktura záznamu zákazníka budou definovat 2 sloupce - jméno a příjmení – sloupce FirstName a LastName.
Spusťme si SSMS a v Object Exploreru si rozbalte větve Databases / mojeDb / Tables. Tedy větev pro tabulky obsažené v nově vytvořené databázi mojedb z minulých dílů. Větev by zatím měla být prázdná (krom seznamu systémových tabulek, který nás zatím nezajímá). V kontextovém menu větve Tables naleznete příkaz nové tabulky New table:
Všimněte si, že je postup velmi podobný jako při vytváření nové databáze. Také využijeme kontextovou nabídku nad seznamem objektů, či konkrétním objektem. Vyhledávání příkazů se díky tomu stává intuitivní a jednoduché.
Nyní se otevře návrhář nových tabulek. Jak už jsem psal, SSMS je pouze vizuální nástroj generující na pozadí textové SQL příkazy. Proto i vše, co můžeme provést v tomto, či jiném dialogu, je možné zapsat i pomocí jazyka T-SQL. O něm se ale zmíním až v dalších dílech. Zatím pro demonstraci možností a vysvětlení funkcí tabulek postačí vizuální návrhář.
Zobrazí se nám okno pro vytvoření nové tabulky a panel vlastností po pravé straně (viz obrázek). Pokud panel vlastností Properties není zobrazen, najdeme jej v menu View nebo přímo vyvoláme klávesou F4.
Okno vlastností tabulky dovoluje nastavit několik vlastností společných pro celou tabulku – tedy nastavení, které se netýkají konkrétních sloupců. Mezi ně patří hlavně jméno Name – defaultně například Table_1 – přepište tuto hodnotu na nové požadované. V našem případě Customer (tabulka zákazníků). Dále zde nacházíme:
- Description - pro textový popis funkce tabulky (volitelné)
- Schema – schéma, do kterého tabulka bude spadat - nechme na defaultní dbo (jeden z dalších článků schémata vysvětluje)
- Lock Escalation – pokročilý způsob optimalizace zamykání záznamů, lepší zatím neřešit – ke správnému pochopení musíte znát dobře princip stránek, indexů, transakcí a zámků
- Regular Data Space Specification – v dílu o datových souborech jsem se zmínil, že lze rozdělit databázi na více datových souborů a právě toto nastavení slouží k vybraní, do jaké skupiny souborů spadá konkrétní tabulka – nechme na jediné defaultní skupině - PRIMARY
- Text/Image Filegroup – dovoluje umístit datové typy zabírající více místa do jiné skupiny souborů - tedy podobná funkce jako Regular Data Space Specification, jen pro konkrétní typy: text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) a uživatelsky definované CLR typy – nechme také na PRIMARY
- Zatím nepřidané vlastnosti – tabulka má celou řadu další vlastností, které v návrháři nejsou (ale měli by být), proto je možné, že v budoucí verzi SSMS zde nalezneme i další upřesňující nastavení, co zatím nezmiňuji
- Hodnoty jen pro čtení – z položek, jenž nejdou upravit (Database Name, Server Name, Identity Column a další) nebudeme dělat žádnou vědu, jsou to jen informativní hodnoty, jejichž smysl pochopíte sami po probrání konkrétního tématu
Seznam všech sloupců je pro definici struktury dat nejdůležitější. V návrháři je reprezentován seznamem, kde upřesňujeme:
- Column Name - jméno sloupce
- Data Type – datový typ sloupce – všechny hodnoty řádků v tomto sloupci jej musí dodržet – popis datových typů bude následovat v dalších odstavcích
- Allow Nulls – povolit hodnoty NULL – pokud je zatržené, dovolujeme tím vložit do tabulky záznam, který ponechává tento sloupec nevyplněný – obdoba null hodnoty v programování s tím rozdílem, že NULL v databázi může být každý typ, včetně těch základních jako je číslo nebo logická hodnota (bit).
Vlastnosti sloupce budou při úpravách sloupců zobrazovat seznam svých nastavitelných vlastností. Těm se budeme věnovat v jednom z dalších článků.
Nyní si založme do tabulky tyto sloupce:
- Jméno: FirstName, typ: nvarchar(50) (text 50 znaků), dovolit prázdnou hodnotu: Ne
- Jméno: LastName, typ: nvarchar(50) (text 50 znaků), dovolit prázdnou hodnotu: Ne
Tabulku uložte (Ctrl+S nebo ikonka uložení) – to na pozadí zapříčiní vygenerování SQL skriptu podle nastavených hodnot a spuštění proti databázi.
Po uložení se tabulka automaticky ihned zobrazí v podseznamu větve Tables u naší databáze (pokud ne, vyvoláme z kontextové nabídky této větve příkaz na aktualizaci Refresh).
Po rozbalení větve této nové tabulky Customer si můžete uvnitř rozbalit i další větev Columns, kde uvidíte nadefinované sloupce:
Praktická ukázka – zobrazení a editace dat v tabulce
Obrázek znázorňuje bohaté kontextové menu pro práci s existující tabulkou. Nalezneme zde tyto možnosti:
- New Table – vytvoří novou tabulku
- Design – zobrazí návrháře vybrané tabulky a dovoluje tak provést dodatečné úpravy struktury sloupců a nastavení
- Select Top [počet] Rows – zobrazí v režimu jen pro čtení obsah tabulky (počet výsledků je početně omezen kvůli výkonu – implicitně 1000 záznamů – limit lze však změnit v Tools / Options v kategorii SQL Server Object Explorer)
- Edit Top [počet] Rows – otevře tabulku v režimu pro úpravy záznamů (řádků) – stejně jako předchozí příkaz, i tento je početně omezen, ale omezení lze změnit v nastavení (většinou to však není potřeba)
- Script Table as ► – dovoluje vygenerovat SQL skripty pro tuto tabulku (vytvoření, smazání, úprava)
- View Dependencies – užitečná funkce zobrazí všechny objekty využívající tuto tabulku nebo naopak objekty používané touto tabulkou – tím se myslí vazby cizími klíči i odkazy v kódu nebo sloupcem pohledu – o tom ale až jindy
- Full-Text index ► – funkce pro pokročilé full-textové vyhledávání – tomu se budu věnovat v několika samostatných dílech
- Policies ►, Facets – funkce vyšších edic pro Policy Management, nebudeme se jimi zabývat
- Start PowerShell – SQL Server 2008 přichází s rozšířením PowerShellu o model podobný právě struktuře Object Exploreru – správou z PowerShellu se ale zabývat zatím nebudu
- Script Data as ► – toto je nabídka přidaná pluginem (http://www.codeplex.com/SSMSAddins) – o rozšiřovaní SSMS bude samostatný článek
- Reports ► – generování tiskových sestav – pro objekt tabulky však zatím neexistují žádné oficiální sestavy
- Rename – přejmenuje tabulku
- Delete – smaže tabulku
- Refresh – tato volba je u všech položek obsahující podpoložky v Object Exploreru – má za následek znovunačtení informací o objektech
- Properties – zobrazí dialog s obecnými vlastnostmi tabulky – pro nás zatím nepodstatný
Z kontextového menu zvolte editaci záznamů Edit Top [počet] Rows. Zobrazí se okno s tabulkou se sloupci, které jsme nadefinovali (FirstName, LastName) a my můžeme editovat jednotlivé řádky do tabulky. Poslední řádek v tabulce označený hvězdičkou navíc obsahuje prázdná pole pro vytvoření řádku nového. Pokud klepneme na levý sloupce, řádek se označí celý a lze jej smazat klávesou Delete.
Můžete si všimnout červeného kolečka u editovaného záznamu. Tak jsou označeny změny, které ještě nebyly zaneseny do databáze. Pokud totiž editujeme řádek, změny se uloží až po jeho opuštění. Takto lze upravit hodnoty všech sloupců celého řádku a pak jej uložit najednou.
Zapsáním klíčového slova NULL (všechna písmena velká) říkáme, že chceme vložit prázdnou hodnotu – to máme ale u obou sloupců zakázanou a tak její vložení neprojde. Například vyplňte v novém řádku pouze FirstName. Při opuštění řádku a pokusu o uložení vám SQL Server vynadá, že nelze vložit hodnota NULL:
Závěr
Pokud jste již pracovali s databází, věřím, že tento díl vám připadal velmi triviální. Dává mi ale možnost se v příštích dílech přímo vrhnout do vysvětlování datových typů, principů klíčů a dalších indexů a omezení již s principiální znalostí prostředí návrháře tabulek. Pokud máte ale jakékoliv dotazy, rád je zodpovím v diskusi.