Tabulky

6. díl - Tabulky

Tomáš Jecha, MVP, MCSD       27.12.2009       SQL, Databáze       22747 zobrazení

Teorii a konfiguraci databázového systému máme za sebou. Je čas se podívat na základní databázový objekt - tabulky. Ty jsou alfou a omegou celé databázové struktury.

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:

New table - context menu SQL Server Management Studio

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ář.

Table designer 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.

image

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:

image

 

Praktická ukázka – zobrazení a editace dat v tabulce

imageObrá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.

Edit table rows - SQL Server Management Studio

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:

Cannot insert the value NULL into column LastName 

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.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Mohlo by vás také zajímat

Úvod do jazyka SQL

Mnoho lidí si myslí, že umí SQL, a náležitě to dávají ostatním najevo, a přitom netuší, že existuje příkaz JOIN. V tomto článku se podíváme na databáze úplně od začátku a naučíme se alespoň základní příkazy SELECT, INSERT, UPDATE a DELETE. Dojde i na ten slibovaný JOIN.

Předávání tabulek do MSSQL 2008 (VB.NET, C#)

Čas od času potřebujeme předat databázi místo jednoho parametru celý seznam. Lepších, či horších způsobů, jak to udělat, je celá řada. Nicméně teprve SQL Server 2008 přichází s funkcí table valued parameters, která dovoluje se seznamy pracovat velmi elegantně. A to jak přímo v kódu SQL Serveru, tak v našich oblíbených jazycích Visual Basic .NET nebo C#.

Automatické generování change scriptů

 

 

Nový příspěvek

 

Diskuse: Tabulky

Věta "Pokud do tabulky následně vložíme záznam (řádek), musíme vyplnit hodnotu všech sloupců." může být pro začátečníka matoucí (NULL, DEFAULT, vypočítané sloupce ...)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je trochu slovíčkaření. Prakticky i persistentní vypočítané sloupce se fyzicky vyplňují a ukládají. Stejně jako defaultní hodnoty nebo přírůstkové klíče. Jenže u přírůstkových klíčů bych musel zmínil, že jejich vkládání lze ponechat na uživateli a tak jej vyplňovat musí. Ačkoliv mohou být sloupce, jejichž hodnota se neuvádí, musí být jasná zjistitelná a v SQL Serveru reprezentovatelná jako běžná hodnota (NULL, computed column). A pokud není hodnota uvedena při zadávání, pořád to může znamenat i stav automatického vložení (defaultní hodnoty, autoinkrementační hodnoty). Je to tedy podle mě jen o úhlu pohledu, který jsem kvůli jednoduchosti zvolil takový, jaký jsem zvolil.

Nechci říkat, že to bylo napsáno 100% korektně. Musím dělat kompromisy mezi přesným vyjádřením a jednoduchostí - vysvětloval jsem základní princip tabulky - tam se musím rozhodovat zda ji popíšu čistě akademickým způsobem, způsobem fyzického uložení nebo způsobem nahlížení na data ze SQL Serveru. Je to celá řada vyjímek, které se dají nalézt všude. Až budu omezení a nové funkce vysvětlovat, důrazně zmíním možnost nevkládat je do tabulek. Teď mi to rozhodně nepřijde tak důležité a spíše ztrátou času pro lidi, kteří s databází začínají. Nemohu vysvětlil vše najednou.

Jinými slovy, matoucí by podle mě bylo například zrovna tuto větu rozvést.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

V pohodě ;-)

já bych tyhle články psal z pohledu uživatele, co se s databází seznamují, což je pro nás otřelé programátory vždycky trochu problém.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

čte se to tady dobře a rychle, ale je tu toho málo

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Tabulky

Pri zakladaní novej tabuľky databáze sa tabuľka nevytvorí a vypíše mi túto chybu:

TITLE: Microsoft SQL Server Management Studio Express

------------------------------

Neznáma chyba

(MS Visual Database Tools)

------------------------------

BUTTONS:

OK

------------------------------

Poprosím o pomoc, čo s tým. Ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste si nechat vygenerovat SQL a ten spustit samostatně. Nebo aplikace takto spadne i při generování kódu?

Slouží k tomu tlačítko "Script" s rozbalovací ikonkou šipky v téměř každém dialogu generující operaci pomocí SQL jazyka.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Chcel som iba vytvoriť novú tabuľku podľa postupu v tomto článku. Som v databázach "úplne nový", takže bohužial Vašej odpovedi nie celkom rozumiem.

===================================

Neznáma chyba

(MS Visual Database Tools)

------------------------------

Program Location:

at Microsoft.VisualStudio.DataTools.Interop.IDTTableDesignerFactory.NewTable(Object dsRef, Object pServiceProvider)

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.TableDesignerNode.CreateDesigner(IDTDocToolFactoryProvider factoryProvider, IVsDataConnection dataConnection)

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.VsDataDesignerNode.CreateDesigner()

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.VsDataDesignerNode.Open()

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.VirtualProject.Microsoft.SqlServer.Management.UI.VSIntegration.Editors.ISqlVirtualProject.CreateDesigner(Urn origUrn, DocumentType editorType, DocumentOptions aeOptions, IManagedConnection con)

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.ISqlVirtualProject.CreateDesigner(Urn origUrn, DocumentType editorType, DocumentOptions aeOptions, IManagedConnection con)

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.ScriptFactory.CreateDesigner(DocumentType editorType, DocumentOptions aeOptions, Urn parentUrn, IManagedConnection mc)

at Microsoft.SqlServer.Management.UI.VSIntegration.Editors.VsDocumentMenuItem.CreateDesignerWindow(IManagedConnection mc, DocumentOptions options)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Odinštaloval som MSSQL 2008 R2, nechal som len 2005 a tam mi založiť tabuľku ide, aj keď je prostredie iné ako v 2008. Nevadí, však sa len učím.

Ďakujem za Váš skvelý web.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback