SQL – manipulace s tabulkami
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:
|
Přidání sloupců do tabulky
Mějme například tabulku ZAMĚSTNANEC, kterou jsme vytvořili příkazem CREATE TABLE:
|
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:
|
Pokud bychom tedy chtěli ke stávající tabulce přidat sloupec FUNKCE, který bude mít defaultní hodnotu ‚žádná‘, budeme postupovat takto:
|
Ú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:
|
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:
|
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:
|
Kdybychom chtěli opět sloupec FUNKCE z naší tabulky ZAMĚSTNANEC odstranit, napíšeme příkaz:
|
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:
|
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)
|
b) s použitím CASCADE (1 příkaz)
|
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í:
|
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:
|
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:
|
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ě:
|
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.
Mohlo by vás také zajímat
-
AI na dosah ruky: Jak je to s AI v osobních zařízeních?
22. ledna 2024 -
Globální výpadek IT systémů: Může za to jediná aktualizace
19. července 2024 -
Webdesign: Jak optimalizovat tlačítka na webu
7. března 2024
Nejnovější
-
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024 -
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024
Honza
Led 31, 2012 v 14:06Přejmenovat sloupec jde:
ALTER TABLE tabulka CHANGE starynazev novynazev VARCHAR(30) NOT NULL
viz. http://dev.mysql.com/doc/refman/5.6/en/alter-table.html
Anonym
Pro 5, 2012 v 0:02Dobrý 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ý.