1 Adatbázis kezelés 2. gyakorlat A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni: Táblák létrehozása, módosítása Mező adattípusok kiválasztása Kulcsértékek meghatározása Táblák közötti kapcsolatok definiálása Intergritási feltételek megadása Csatlakozás az adatbázishoz Indítsunk egy böngészőt, és írjuk bele: http://193.224.129.119/dbgyak. A gyakorlat céljaira használjuk az uneptunkód felhasználónevet. Az ehhez tartozó jelszó is ugyanaz. Az ABC123 neptunkódú hallgató felhasználói neve tehát uabc123, jelszava uabc123.
2 A továbbiakban, amikor e leírásban az uneptun vagy hasonló nevet használjuk, akkor azt minden hallgató a saját neptun kódjának behelyettesítésével értelmezze. Táblák definiálása Hozzunk létre egy jármű táblát. A tábla tartalmazza a jármű típusát és rendszámát. CREATE TABLE jarmu (rsz CHAR(6), tipus VARCHAR(20)); A létrejött táblába szúrjunk be néhány adatot: INSERT INTO jarmu VALUES ( JKK567, személyautó ); INSERT INTO jarmu VALUES ( IFA453, teherautó ); Egyszerre több rekordot is beszúrhatunk: INSERT INTO jarmu VALUES ( EVI001, roller ), ( ADI007, motorkerékpár );
3 Nem kell minden parancsot újra begépelni, a Szerkesztés gomb megnyomásával megnyílik az alábbi ablak, amiben a megfelelő módosítások után kényelmesen többször is kiadhatjuk a parancsokat: Ha van már legalább 5 rekordunk, listázzuk ki a tábla rsz és tipus mezőit: SELECT rsz, tipus FROM jarmu Mivel a tábla összes mezőjét kilistáztuk, az összes mező felsorolása helyett a * is használható: SELECT * FROM jarmu Az egyes mezőket átnevezhetjük az eredményrelációban, ha valamiért szükség van erre: SELECT rsz AS Rendszám, tipus AS Típus FROM jarmu A fentiek tetszőlegesen variálhatók:
4 SELECT *, rsz, rsz AS Rendszám FROM jarmu
5 A rendszám mezőnek kulcsnak kellene lennie, de ezt egyelőre nem állítottuk be. Így most még gond nélkül felvehetünk azonos rendszámú járműveket, ami nyilvánvalóan hibás adatfelvitelre utal: INSERT INTO jarmu VALUES ('JNN867', 'bicikli'), ('JNN867','traktor'); Ezt az állapotot meg kell szüntetnünk. Állítsuk be, hogy rsz kulcsmező legyen: ALTER TABLE jarmu ADD PRIMARY KEY (rsz);
6 A parancsot nem tudta végrehajtani. Magyarázzuk meg az okát!
7 Töröljük ki a hibát okozó rekordokat: DELETE FROM jarmu WHERE rsz = 'JNN867'; Adjuk ki újra a korábbi parancsot, amivel az rsz mezőt kulcsértéknek állítjuk be: ALTER TABLE jarmu ADD PRIMARY KEY (rsz); Most már sikerült, hiszen nincs olyan rekord, ami ne tartaná be a megfogalmazott szabályt.
8 Ezután már létező rendszámokat nem tudunk újra felvinni: INSERT INTO jarmu VALUES ('JNN867', 'bicikli'), ('JNN867','traktor'); Ellenőrizzük a fenti parancs után a tábla tartalmát! Mit tapasztaltunk? Válasszunk egy rekordot, és módosítsuk a tartalmát. A rekord a kulcsérték alapján egyértelműen megtalálható. UPDATE jarmu SET tipus = 'Személygépjármű' WHERE rsz = GJG593 Figyeljük meg, hogy a tábla szerkezetét az ALTER, a tábla adattartalmát pedig az UPDATE parancsokkal tudjuk módosítani. Adjunk egy márka mezőt a táblához: ALTER TABLE jarmu ADD marka VARCHAR(20) Nézzük meg a tábla tartalmát.
9 Töltsük fel a tábla márka mezőjét életszerű adatokkal, például: UPDATE jarmu SET marka = 'IFA' WHERE rsz = IFA453 A fentihez hasonló parancsok kiadása közben ellenőrizzük, van e olyan rekord, amiben a márka mezőt még nem töltöttük ki: SELECT * FROM jarmu WHERE marka IS NULL Így bármikor ellenőrizhetjük, hogy mely rekordokat kell még módosítanunk. Vegyük fel a gyártási év mezőt is: ALTER TABLE jarmu ADD gyartasiev int Töltsünk bele adatokat: UPDATE jarmu SET gyartasiev = 1980 WHERE rsz = IFA453 Készítsünk olyan lekérdezést, ami a járművek adatai mellett azok életkorát is kiírja: SELECT *, 2014 gyartasiev AS Kor FROM jarmu A CURDATE() és YEAR() függvények segítségével a lekérdezés univerzálisabb, hiszen nem tartalmazza konstansként a jelenlegi aktuális évszámot: SELECT *, YEAR ( CURDATE() ) gyartasiev AS Kor FROM jarmu Figyeljük meg, hogy a járművek korát sehol nem tároltuk le, csupán a lekérdezés alatt számítottuk ki és így az eredményrelációba került. Az eredményreláció pedig nem kerül tartós tárolásra. Több tábla kapcsolata Kapcsoljuk a napsugár tábla óvodásaihoz a járműveket! Most feltételezzük, hogy egy gyerek egyetlen járművet birtokolhat és egy járműnek egyetlen kis gazdája lehet. Ez egy 1:1 kapcsolat. Először vizsgáljuk meg a napsugár tábla szerkezetét! Természetesen megtehetjük a grafikus felületen is, de ehelyett most adjuk ki a következő parancsot: SHOW CREATE TABLE napsugár
10 A parancs a következő kimenetet adja (a teljes adattartalom megtekintéséhez jelöljük be a Teljes szövegek rádiógombot a Beállítások között): Megkaptuk azt a parancsot, amivel a napsugár táblát létre lehet hozni (adatok nélkül, természetesen). Ellenőrizzük, hogy van e a táblának kulcsa (PRIMARY KEY). A fenti képernyőképen látható, hogy az ID mező kulcsként használható, ezért ezt, mint idegen kulcsot, be tudjuk írni a jármű táblába. Ehhez létre kell hoznunk egy tulajdonos mezőt, ahol arra kell figyelnünk, hogy a típusa feleljen meg az idegen kulcs (ID) típusának (INT). ALTER TABLE jarmu ADD tulajdonos INT Azt, hogy egy gyerek csak egy járművet birtokolhasson, a tulajdonos mezőt beállíthatjuk úgy, hogy az azonosítója csupán egyetlen járműnél szerepelhessen, azaz a táblában egyedi legyen: ALTER TABLE jarmu ADD UNIQUE(tulajdonos) A fenti két parancsot egyszerűen így is egybeírhattuk volna: ALTER TABLE jarmu ADD tulajdonos int UNIQUE
11 A két tábla összekapcsolásához egy modernebb adatbázis motort és táblaformátumot kell használnunk. Ennek részleteibe nem megyünk bele. Adjuk ki a következő parancsokat: ALTER TABLE napsugár ENGINE=InnoDB; ALTER TABLE jarmu ENGINE=InnoDB; Ezután már beállíthatjuk, hogy a tulajdonos mező a napsugár tábla kapcsolómezője legyen, és a napsugár táblában az id mező értékét tartalmazza: ALTER TABLE jarmu ADD FOREIGN KEY(tulajdonos) REFERENCES napsugár (id) Módosítsunk a táblák adatain, szerezzünk tapasztalatot a kapcsolómező működéséről! A következő paranccsal figyeljük meg a jarmu tábla szerkezetét: SHOW CREATE TABLE jarmu Láthatjuk, hogy milyen jarmu_idfk_1 néven hivatkozhatunk a két tábla kapcsolatára. Ez a név hasznos például, ha törölni akarjuk: ALTER TABLE jarmu DROP FOREIGN KEY jarmu_ibfk_1; Tegyük fel, most azt szeretnénk megoldani, hogy ha egy gyereket törlünk, mert például kijárta az óvodát, akkor a hozzá tartozó jármű is törlődjön az adatbázisból:
12 ALTER TABLE jarmu ADD FOREIGN KEY(tulajdonos) REFERENCES napsugár (id) ON DELETE CASCADE; Próbáljunk is egy olyan gyereket törölni, akinek van járműve és figyeljük meg, mi történik. (Visszafelé nem működik ez a törlés, hiszen ha a járművet töröljük, a gyerek megmarad!) A feladat befejezése A munka végeztével jelentkezzünk ki az adatbázis kliensből.