6.8. Relace mezi tabulkami

6.8.1. Opakování - knihovna - tvorba, vkládání, hledání v tabulce

1 Stáhněte si přes FTP z fileserveru pomocí účtu anonym soubor db06.zip a extrahujte jej tak, aby rozbalené soubory byly ve složce c:\temp\db06 FileZilla
2 Otevřte v textovém editoru soubor skolni_knihovna.sql a ověřte správnost příkazů a kódování češtiny (musí být UTF-8) PSPad
3 Přidejte příkazy pro začátek transakce (BEGIN TRANSACTION;) a konec transakce (COMMIT;) a soubor uložte  
4 Spusťte příkazový řádek, přejděte v něm do složky \temp\db06, přepněte se do kódové stránky 65001 cmd, cd, chcp
5 Vytvořte ve složce db06 novou databázi db06.sqlite spuštěním:
c:\programy\sqlite\sqlite3 db06.sqlite
cmd
6 Ověřte příkazem .databases správnost cesty c:\temp\db06\db06.sqlite sqlite3
7 Vytvořte novou tabulku načtením souboru skolni_knihovna.sql .read
8 Vytvořte index pro sloupec autor příkazem:
CREATE INDEX index_autor ON knihovna (autor);
 
9 Vypište knihy spisovatelů Steinbecka a Dreisera seřazené podle autora (nastavte si režim .mode column, .headers on) select
10 Přidejte do tabulky knihovna sloupce pro čtenáře a datum výpůjčky podle schématu uml opakováním příkazu:
ALTER TABLE knihovna ADD COLUMN xxx text;
sqlite3
11 Nasimulujte evidenci vypůjčení knih autora "Defoe" vložením hodnot čtenáře a datumu (jako čtenáře použijte vlastní jméno bez diakritiky, datum uveďte ve tvaru RRRR-MM-DD):
UPDATE knihovna SET ctenar = 'xxx' WHERE autor='yyy';
UPDATE knihovna SET datum_vypujcky = 'RRRR-MM-DD' WHERE autor='yyy';
 
12 Vypište si vlastní výpůjčky select

6.8.2. Relace 1:N

Základní typ relace mezi tabulkami:

UML schéma nových tabulek pro evidenci výpůjček včetně relace 1:N:

  • odkazu do jiné tabulky - zde sloupci id_ctenar v tabulce knihy - se říká foreign key (cizí klíč)
13 Otevřte v textovém editoru soubor skolni_knihovna.sql - nahraďte v příkazech název tabulky z knihovna na knihy, přidejte sloupec id_ctenar a soubor uložte jako knihy.sql PSPad - knihy.sql
14 Upravte ve stejném souboru příkazy pro vytvoření tabulky ctenari (viz schéma výše), která bude obsahovat tři vymyšlené čtenáře - soubor uložte jako ctenari.sql PSPad -ctenari.sql
15 Vytvořte v databázi db06.sqlite nové tabulky načtením souborů knihy.sql a ctenari.sql, ověřte existenci těchto tabulek a jejich hodnot .read, select
16 Evidujte prvnímu čtenáři (id_ctenar=1) výpůjčku všech knih od autora Dickens:
UPDATE knihy SET id_ctenar = 1 WHERE autor='yyy';
 
17 Vypište si výpůjčky tohoto prvního čtenáře select
18 Podobně zaevidujte výpůjčky ostatním dvěma čtenářům (autory vyberte sami) update

Referenční integrita

CREATE TABLE knihy (
id_knihy integer primary key,
nazev text,
autor text,
signatura text,
id_ctenar integer REFERENCES ctenari ON DELETE RESTRICT);

6.8.3. Spojování tabulek svázaných relacemi - JOIN

19 Vypište všechny vypůjčené knihy včetně jmen čtenářů:
SELECT * FROM knihy JOIN ctenari USING (id_ctenar);
 
20 Vypište název knih vypůjčených zvoleným čtenářem (v dotazu použijte jeho jméno):
SELECT nazev FROM knihy JOIN ctenari USING (id_ctenar) WHERE jmeno='xxx';
 
21 Vytvořte tabulku pujcene_knihy, která bude vytvořena příkazem select z úkolu č. 19. Ověřte si poté příkazem .schema strukturu vytvořené tabulky a vypište si všechny řádky tabulky.  
22 Vypište z tabulky pujcene_knihy název knih vypůjčených zvoleným čtenářem (v dotazu použijte jeho jméno - viz úkol. č. 20)  

Další varianty JOIN - diagramy

6.8.4. Relace N:N

23 Vytvořte novou databázi knihovna2.sqlite, vytvořte v ní 3 výše uvedené tabulky (využijte knihy.sql, ctenari.sql) a zaevidujte alespoň 1 výpůjčku příkazem INSERT INTO vypujcky (názvy sloupců...) VALUES (hodnoty...);  
24 Celou složku db06 uložte na fileserver Filezilla