V minulém díle jsme se postupně seznámili s tvorbou databázových tabulek. Dnes plynule navážeme a řekneme si o základní manipulaci s již existujícími tabulkami. Můžeme měnit strukturu tabulek přidáváním, modifikací nebo odebíráním sloupců. Vytvořené tabulky je možné ze systému vymazat. Dále se budu věnovat databázovým schématům, neboť tabulky, jako každé jiné databázové objekty, můžeme seskupovat do různých schémat (kolekcí). Předpokládám, že čtenář se již seznámil s obsahem obou předchozích dílů.

Během provozu našeho databázového systému se může naskytnout situace, kdy usoudíme, že je výhodné nebo potřebné upravit struktury našich tabulek. Se sloupci můžeme provést několik operací. Buď můžeme sloupec přidat, nebo existující sloupec zmodifikovat (jeho typ, nebo integritní omezení) a nebo nějaký sloupec z tabulky úplně vypustit. Základní příkaz, který se používá pro jakoukoliv manipulaci s existující tabulkou je:

ALTER TABLE jméno_tabulky
vlastní příkaz pro aktualizaci

Přidání sloupců do tabulky

Mějme například tabulku ZAMĚSTNANEC, kterou jsme vytvořili příkazem CREATE TABLE:

CREATE TABLE zaměstnanec
(číslo INTEGER,
jméno VARCHAR(10),
příjmení VARCHAR(20),
rodné_číslo VARCHAR(11) NOT NULL,
PRIMARY KEY (číslo))


Nyní chceme do této tabulky přidat nový sloupec. Pokud ještě nemáme v tabulce žádná data, můžeme tabulku smazat a vytvořit znovu. V příkazu CREATE TABLE bychom zapsali definici i nového sloupce, který chceme přidat. Druhá možnost, v případě, že v tabulce již nějaká data jsou, lze použít následující příkaz:

ALTER TABLE jméno_tabulky
ADD (jméno_sloupce typ_sloupce [integritní omezení],
   …
)


Pokud bychom tedy chtěli ke stávající tabulce přidat sloupec FUNKCE, který bude mít defaultní hodnotu ‚žádná‘, budeme postupovat takto:

ALTER TABLE zaměstnanec
ADD (funkce VARCHAR(10) DEFAULT ‚žádná‘)

Úprava definice sloupců

Jako v předchozím případě, pokud v tabulce nemáme ještě žádná data, může být někdy jednodušší tabulku smazat a vytvořit ji nově, podle nových požadavků. Jinak máme opět možnost použít další ze sady příkazů ALTER TABLE. Chceme-li změnit typ, nebo integritní omezení některých sloupců, použijeme příkaz:

ALTER TABLE jméno_tabulky
MODIFY (jméno_sloupce typ_sloupce [integritní omezení],
    …
)


Pokud bychom se tedy rozhodli, že sloupec FUNKCE nebude řetězec o délce 10 znaků, ale že 5 znaků stačí, pak bychom napsali příkaz:

ALTER TABLE zaměstnanec
MODIFY (funkce VARCHAR(5) DEFAULT ‚žádná‘)


Otázka zní, co se stane s původními hodnotami. Těžko říct. Většinou to bude záležet na konkrétním databázovém systému. Nejpravděpodobněji budou všechny hodnoty ořezány na 5 znaků (což by nám nemělo vadit, když jsem měnili délku z důvodu, že 5 znaků pro funkci nám stačí), nebo se všechny původní hodnoty zruší a nastaví se místo nich hodnota ‚žádná‘.

Poměrně vážný problém by mohl nastat, kdybychom si vytvořili novou tabulku FUNKCE, která by obsahovala sloupce ČÍSLO a NÁZEV, a v původní tabulce ZAMĚSTNANEC bychom chtěli zmodifikovat typ sloupce FUNKCE z řetězce na celé číslo, které má být cizím klíčem do tabulky FUNKCE. To už nemůžeme udělat přímo. Musíme si vytvořit nějakou pomocnou dočasnou tabulku, udělat určité přesuny dat, pak změnit typ sloupce FUNKCE a pak zálohovaná data překonvertovat a přesunout zpět. Takový postup vyžaduje už velmi pokročilé znalosti jazyka SQL, resp. jeho procedurálního rozšíření známého pod názvem PL/SQL. K této problematice se možná dostanu později až v závěru celého seriálu o SQL. Zatím si pamatujme, že pokud chceme změnit typ sloupce, měl by nový typ být s tím starým kompatibilní.

V žádném případě nedoporučuji měnit typy sloupců, které jsou primárními nebo cizími klíči. V takových případech je opravdu nejlepší, udělat zálohu dat, všechny takové tabulky smazat a vytvořit je nově. Rovněž změna primárního klíče v tabulce může vyvolat řadu nepříjemností. (Osobně si myslím, že pokud se dostaneme do situace, kdy potřebujeme změnit primární klíč, svědčí to o špatném návrhu tabulek.)

Mazání sloupců

Mazání sloupců by nám obecně nemělo přinést mnoho starostí. Máme-li nějaký sloupec, jehož hodnoty už opravdu nepotřebujeme, jednoduše jej smažeme následujícím příkazem:

ALTER TABLE jméno_tabulky
DROP jméno_sloupce [CASCADE]


Kdybychom chtěli opět sloupec FUNKCE z naší tabulky ZAMĚSTNANEC odstranit, napíšeme příkaz:

ALTER TABLE zaměstnanec
DROP funkce


Jediný problém by mohl nastat, kdybychom chtěli smazat sloupec, na který se odkazuje cizí klíč v jiné tabulce (v podstatě bychom mazali primární klíč, což samozřejmě obecně lze). Kdybychom tedy chtěli smazat takový sloupec, museli bychom nejdříve v tabulce u cizího klíče zrušit jeho integritní omezení (musel by přestat být cizím klíčem) a pak bychom náš sloupec mohli klidně smazat. Pokud bychom ale chtěli smazat i sloupec onoho cizího klíče, můžeme to provést naráz a bez námahy, právě díky klíčovému slovu CASCADE. Použití slova CASCADE má za následek, že smažeme uvedený sloupec a všechny ostatní sloupce, které se na náš mazaný sloupec odkazovaly, budou také smazány. Podívejme se na následující příklad:

CREATE TABLE oddělení
(číslo INTEGER,
název VARCHAR(20),
PRIMARY KEY (číslo))

CREATE TABLE platy
(číslo INTEGER,
funkce VARCHAR(10),
plat FLOAT(10) DEFAULT 8000,
PRIMARY KEY (číslo))

CREATE TABLE zaměstnanec
(číslo INTEGER,
jméno VARCHAR(10),
příjmení VARCHAR(20),
rodné_číslo VARCHAR(11) NOT NULL,
čís_odd INTEGER,
funkce INTEGER,
PRIMARY KEY (číslo),
FOREIGN KEY (čís_odd) REFERENCES oddělení (číslo),
FOREIGN KEY (funkce) REFERENCES platy (číslo))


Uvedenými příkazy jsme vytvořili tabulky ODDĚLENÍ, PLATY a ZAMĚSTNANEC. Nyní se rozhodneme, že v tabulce ODDĚLENÍ smažeme sloupec ČÍSLO a zároveň smažeme v tabulce ZAMĚSTNANEC sloupec ČÍS_ODD. Máme dvě možnosti, jak to provést:

a) bez použití CASCADE (2 příkazy)

ALTER TABLE zaměstnanec
DROP čís_odd

ALTER TABLE oddělení
DROP číslo


b) s použitím CASCADE (1 příkaz)

ALTER TABLE oddělení
DROP číslo CASCADE


Po provedení jednoho z uvedených postupů bude tabulka ODDĚLENÍ obsahovat pouze sloupec NÁZEV a tabulka ZAMĚSTNANEC bude o sloupec ČÍS_ODD chudší. Je jasné, že takový příklad nemá v praxi moc velké opodstatnění, uvedl jsem jej zde pouze z ilustračních důvodů.

Přejmenování sloupce

Pro přejmenování sloupce nemáme v SQL žádný konkrétní příkaz. Abychom přejmenovali sloupec, je potřeba provést několik kroků: Nejprve musíme vytvořit sloupec nového názvu, pak zkopírovat hodnoty ze starého sloupce do nového, a nakonec smažeme ten sloupec se starým názvem. Uvedu příklad. Vezměme si naši tabulku ZAMĚSTNANEC včetně sloupce FUNKCE. Rozhodli jsme se, že sloupec FUNKCE přejmenujeme na ZAŘAZENÍ. Posloupnost příkazů SQL, jak toho docílit je následující:

ALTER TABLE zaměstnanec
ADD (zařazení VARCHAR(5) DEFAULT ‚žádná‘)

UPDATE zaměstnanec
SET zařazení = funkce

ALTER TABLE zaměstnanec
DROP funkce


První příkaz vytvoří nový sloupec ZAŘAZENÍ, druhý příkaz slouží pro aktualizaci hodnot ve sloupcích. Příkaz UPDATE budu probírat až v příštím díle, zatím si vystačíme s tím, že budeme vědět, že tento příkaz zkopíruje hodnoty ze sloupce FUNKCE do sloupce ZAŘAZENÍ. Poslední příkaz pak smaže sloupec FUNKCE. Tímto postupem docílíme přejmenování sloupce. Jenom malá poznámka na závěr. Nový sloupec se bude vypisovat až jako poslední, tzn. že se neuchová původní pořadí sloupců, jaké bylo, což z hlediska vyhledávání informací v databázi vůbec nevadí.

Mazání tabulek

Pokud se z nějakého důvodu rozhodneme smazat tabulku z databázového systému, provedeme to jednoduše následujícím příkazem:

DROP TABLE jméno_tabulky


Příkaz je to velmi jednoduchý a snadno zapamatovatelný. Ovšem při zbrklém jednání může napáchat hodně škody. Téměř žádný systém se vás nebude ptát, zdali opravdu chcete zrušit tabulku, takže použití tohoto příkazu je nutné dobře zvážit. Pokud chceme smazat z tabulky pouze data (nikoliv tabulku samotnou), provedeme to příkazem DELETE, o kterém budu mluvit příště. Je zřejmé, že pokud provedeme příkaz DROP TABLE, tak přijdeme o všechna data, která v mazané tabulce byla uložena.

Databázová schémata

Databázové schéma je kolekce databázových objektů. Do této kolekce patří např. tabulky, uživatelé, procedury, triggery, sekvence, apod. Pokud v této chvíli některým uvedeným pojmům ještě nerozumíte, nevadí, to jsem předběhl, k nim se dostanu až později. Některé z nich patří do pokročilých znalostí o jazyku SQL. Databázová schémata vytváří správce SQL serveru. Obecně každý uživatel má k dispozici svoje databázové schéma. To je defaultní, a proto všechny příkazy ohledně tabulek fungují, jak jsem uvedl. Nicméně se může stát, že vám správce serveru nastaví oprávnění manipulovat s tabulkami, které náleží jinému schématu. Takové tabulky musíme adresovat kromě jejich jména i jménem schématu, ve kterém se nachází. V jazyce SQL to vyřešíme zápisem:

jméno_schématu.jméno_tabulky


na místo, kde potřebujeme uvést jméno tabulky.

Uveďme si následující příklad. Uživatel „skrivan“ se přihlásí k SQL serveru. Po přihlášení je automaticky nastaven ve svém schématu, jehož jméno odpovídá např. jeho loginu. Správce databáze vytvořil schéma „common“, do kterého má uživatel „skrivan“ právo přístupu pro jakoukoliv manipulaci s tabulkami. Ve schématu „common“ bude chtít uživatel „skrivan“ vytvořit novou tabulku ÚKOLY se sloupci ČÍSLO, POPIS a DATUM_SPLNĚNÍ. Příkaz CREATE TABLE bude vypadat následovně:

CREATE TABLE common.úkoly
(číslo INTEGER PRIMARY KEY,
POPIS VARCHAR(30) NOT NULL,
DATUM_SPLNĚNÍ DATE)


To by k základní práci s tabulkami v jazyce SQL bylo vše. Tím jsem částečně probral část SQL a to jazyk SDL (Storage Definition Language), který je určen pro práci s tabulkami. Funkčnost příkazů pracujících s tabulkami, které jsem zde a v předchozím díle uvedl, jsem otestoval na systému Oracle. Nyní se přesuneme do jazyka DML (Data Manipulation Language). V příštím díle si budeme povídat o základní manipulaci s daty, tj. budeme už pracovat s vlastními obsahy tabulek.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

2 Příspěvků v diskuzi

  1. Dobrý den,

    tyto články, na které se dostávám průběžně jako tématicky související, se mi líbí, ale jako začátečník bych uvítal trochu struktury. Kromě prvních tří není poznat, jaký článek navazuje na který.

Odpovědět