Relációsémák létrehozása SQL nyelvben SQL (Structured Query Language) lekérdezés módosítás relációséma leírására alkalmas utasítások: attribútumnevek, attribútumok adattípusa megszorításokat is megadhatunk, melyeket az adatoknak ki kell elégíteniük, hogy bekerüljenek az adatbázisba.
Minden relációs ABKR rendelkezik egy SQL interpreterrel, melynek segítségével az SQL nyelv parancsait begépelhetjük és végrehajthatjuk. Oracle SQL interpreterje az SQL-PLUS MS SQL Server-é a Query Analyzer.
Adattípusok Egy relációséma definiálása esetén minden attribútumnak meg kell adni az adattípusát. Fontosabb adattípusok: Karaktersorok, melyek lehetnek rögzített (CHAR(n)) vagy változó hosszúságúak (VARCHAR(n)). Egész számok (INT vagy INTEGER, esetleg SHORTINT, melyet kevesebb biten tárol a rendszer). Lebegpontos értékek (REAL, vagy nagyobb pontossággal a DOUBLE PRECISION). Dátumok és idk (DATE és TIME). BLOB-bak (Binary Large Objects).
Relációk létrehozása A CREATE TABLE parancs segítségével relációkat (táblákat) tudunk létrehozni. A parancs komplex, lásd a megszorításoknál. CREATE TABLE Alkalmazottak ( SzemSzám INT, Név VARCHAR(30), Fizetés REAL, SzülDat DATE, Nem CHAR(1), RészlegID INT );
Relációsémák módosítása Elfordul, hogy a létez tábla szerkezetét meg kell változtatnunk, ALTER TABLE Alkalmazottak ADD COLUMN Telefon CHAR(16); ALTER TABLE Alkalmazottak DROP COLUMN SzülDat; Relációk törlése DROP TABLE <tábla_név>;
Alapértelmezés szerinti értékek új sor beszúrása esetén, nem mindig ismerjük minden oszlop értékét. megoldás: NULL érték, amit magyarul mondhatnánk úgy, hogy nem tudom, kivéve, ha van NOT NULL megszorítás. egy alapértelmezés szerinti érték a NULL helyett, ezt a DEFAULT kulcsszó segítségével adhatjuk meg.
CREATE TABLE Alkalmazottak ( SzemSzám INT, Név VARCHAR(30), Fizetés REAL, SzülDat DATE DEFAULT 1900-01-01, Nem CHAR(1) DEFAULT?, RészlegID INT, Telefon CHAR(16) DEFAULT ismeretlen );
Értéktartományok Értéktartomány: egy adattípus, esetleg alapértelmezett értékkel és megszorításokkal. Attribútum típusának definiálhatunk egy értéktartományt. Több attribútumnak is lehet ugyanaz az értéktartománya, ami sok esetben hasznos lehet. Ha változik valami, csak egy helyen kell változtatni. CREATE DOMAIN <név> AS <típusleírás>;
példa: A címet gyakran használjuk személyek, vevk, szállítók stb. esetén, ezért definiálhatunk neki egy értéktartományt: CREATE DOMAIN CímDom AS VARCHAR(50) DEFAULT nem ismert ; A tábla definíciójában a Cím attribútum típusa CímDom: Cím CímDom; létez értéktartomány módosítása: ALTER DOMAIN parancs törlése DROP DOMAIN utasítással.
CREATE TABLE Alkalmazottak ( SzemSzám INT, Név VARCHAR(30), Cím CímDom; Fizetés REAL, SzülDat DATE DEFAULT 1900-01-01, Nem CHAR(1) DEFAULT?, RészlegID INT, Telefon CHAR(16) DEFAULT ismeretlen );
Megszorítások az adatbázis módosításakor az új információ nagyon sokféleképpen lehet hibás. ahhoz, hogy az adatbázis adatai helyesek legyenek, különböz feltételeknek kell eleget tenniük. A megszorítások azon követelmények, melyeket az adatbázis adatai ki kell elégítsenek, ahhoz, hogy helyeseknek tekinthessék ket.
Megszorításokat osztályozása 1. Egyedi kulcs feltétel: egy relációban nem lehet két sor, melyeknek ugyanaz a kulcsértéke, vagyis ha C egy R reláció kulcsa, t1, t2 R sorok esetén π C ( t1) π C ( t2) (lásd relációs algebrai mveletek Error! Reference source not found.). 2. Hivatkozási épség megszorítás: megköveteli, hogy egy objektum által hivatkozott érték létezzen az adatbázisban. Ez analóg azzal, hogy a hagyományos programokban tilosak azok a mutatók, amelyek sehova se mutatnak. 3. Értelmezéstartomány-megszorítások: azt jelentik, hogy egy attribútum az értékeit a megadott értékhalmazból vagy értéktartományból veheti fel.
4. Általános megszorítások: tetszleges követelmények, amelyeket be kell tartani az adatbázisban. Hivatkozásiépség megszorítás: Küls kulcs egy KK attribútum (attribútumhalmaz) egy R 1 relációból: értékeinek halmaza ugyanaz, mint egy R 2 reláció elsdleges kulcsának az értékhalmaza, és az a feladata, hogy az R 1 és R 2 közötti kapcsolatot modellezze. R 1 az a reláció, mely hivatkozik, az R 2 pedig, amelyre hivatkozik. Más megnevezés: az R 2 az apa és az R 1 a fiú egy sorhoz az R 2 -bl tartozhat több sor az R 1 -bl, R 2 -ben elsdleges kulcs az attribútum ami a kapcsolatot megteremti. (Fordítva nem állhat fenn a kapcsolat)
A hivatkozási épség megszorítás a következket jelenti: az R 2 relációban azt az attribútumot (esetleg attribútumhalmazt), melyre az R 1 hivatkozik elsdleges kulcsnak kell deklarálni, KK minden értéke az R 1 -bl kell létezzen az R 2 relációban, mint elsdleges kulcs értéke. példa: Az Alkalmazottak (R 1 ) reláció hivatkozik a Részlegek (R 2 ) relációra a RészlegID (KK) küls kulcs segítségével.
Alkalmazottak (a fiú): SzemSzám Név RészlegID Fizetés 111111 Nagy Éva 2 300 222222 Kiss Csaba 9 400 456777 Szabó János 9 900 234555 Szilágyi Pál 2 700 123444 Vincze Ildikó 1 800 333333 Kovács István 2 500 Részlegek (az apa): RészlegID RNév Manager SzemSzám 1 Tervezés 123444 2 Könyvelés 234555 9 Beszerzés 456777
példa: Szállítók (SzállID, SzállNév, SzállCím) Áruk (ÁruID, ÁruNév, MértEgys) Szállít (SzállID, ÁruID, Ár) A Szállít reláció hivatkozik a Szállítók relációra a SzállID küls kulcs segítségével, illetve az Áruk relációra az ÁruID segítségével. (Szállítók apa, Áruk apa, Szállít fiú.)
A hivatkozási épség megszorítás az adatbázis aktualizálása esetén három esetben sérülhet. 1) Új sor hozzáillesztése az R 1 (fiú) relációba. 2) Törlés az R 2 (apa) relációból. 3) Módosítás R 1 (fiú) relációba, illetve R 2 (apa) relációban.
1) Új sor hozzáillesztése az R 1 relációba: a KK küls kulcs értékét csak akkor vihetjük be az R 1 (fiú) reláció megfelel oszlopába, ha az már létezik elsdleges kulcsként az R 2 (apa) relációban. példa: A példa esetén nem illeszthetünk olyan alkalmazottat az Alkalmazottak relációba, amelynek a RészlegID attributúm értéke például 5, mivel ez nem létezik a Részlegek relációban. Lehetséges értékek az aktuális állapotban: 1, 2 és 9. 2) R 2 (apa) relációból nem törölhetjük ki azokat az elsdleges kulcsértékeket, melyekre van hivatkozás az R 1 (fiú) relációból. példa: A példa esetén nem törölhetjük ki egyik részleget sem, mert mindegyikre van hivatkozás, ha netán kitörölnénk, az Alkalmazottak relációban maradnának ún. lógó sorok.
3) Módosítás felmerülhet mind a két relációban. Ha az R 1 (fiú) relációban módosítunk egy KK értéket, csak az R 2 (apa) relációban létezre módosíthatjuk. Ha az R 2 (apa) relációban lev elsdleges kulcsot akarjuk módosítani, csak akkor tehetjük meg, ha nincs rá hivatkozás az R 1 (fiú) relációból. példa: Az Alkalmazottak relációban a Kovács István -ra vonatkozó bejegyzés esetén a RészlegID-t módosíthatjuk 1 vagy 9-re, de nem módosíthatjuk például 3-ra. A Részlegek egy RészlegID-jét sem módosíthatjuk, mivel mindegyikre van hivatkozás. Esetleg módosíthatnánk egy már létez értékre a Részlegek táblából, de mivel a RészlegID elsdleges kulcs a Részlegek táblában, nem tehetjük meg.
Megszorítások SQL-ben Az SQL2-ben az épségi megszorításokat az adatbázisséma részeként adjuk meg. Mikor egy adatbázis alkalmazás fut, az ABKR ellenrzi, hogy a megszorítások teljesülnek-e, és ha nem, nem engedi meg a változtatást. Egyedi kulcsok SQL-ben CREATE TABLE Áruk ( ÁruID INT PRIMARY KEY, ÁruNév CHAR(30), MértEgys CHAR(10) );
összetett kulcs esetén CREATE TABLE Szállít ( SzállID INT, ÁruID INT, Ár REAL, PRIMARY KEY (SzállID, ÁruID) ); Más lehetség kulcsok deklárálására a UNIQUE kulcsszó egy relációnak lehet több kulcsjelöltje, ezeket adjuk meg a UNIQUE kulcsszó segítségével. A kulcsjelöltek közül egyet kiválasztunk elsdleges kulcsnak és azt a PRIMARY KEY kulcsszó segítségével adjuk meg.
példa: Az Áruk tábla esetén kérhetjük, hogy az ÁruNév értékei egyediek legyenek: CREATE TABLE Áruk ( ÁruID INT PRIMARY KEY, ÁruNév CHAR(30) UNIQUE, MértEgys CHAR(10) ); CREATE TABLE Szállítók ( SzállID INT PRIMARY KEY, SzállNév CHAR(30) UNIQUE, CodFisc CHAR(10) UNIQUE, Cím CímDom; );
Elsdleges kulcs és egyedi attribútumok Hasonlóság: az ABKR-nek van gondja arra, hogy ne lehessen két sor a táblában, amelyben a kulcsként (PRIMARY KEY, UNIQUE) deklarált attribútumérték ugyanaz. Különbség: Elsdleges kulcs csak egy lehet, egyedi attribútum több is lehet. Küls kulcs csak elsdleges kulcsára hivatkozhat egy relációnak. ABKR-tl függen, az elsdleges kulcsnak megfelelen létrehoz az ABKR indexállományt, egyedi attribútum deklarálása esetén az adatbázis adminisztrátor kell az indexállományt létrehozza, a keresés gyorsítása érdekében.
Küls kulcsok SQL-ben Küls kulcsot a CREATE TABLE utasításon belül kétféleképpen deklarálhatunk: 1. Ha a küls kulcs egyetlen attribútum, az attribútum után: REFERENCES <táblanév> (<attribútum>) példa: CREATE TABLE Szállít ( SzállID INT REFERENCES Szállítók (SzállID), ÁruID INT REFERENCES Áruk (ÁruID), Ár REAL, PRIMARY KEY (SzállID, ÁruID) );
2. Ha a küls kulcs több attribútumból áll FOREIGN KEY <attribútumok> REFERENCES <táblanév> (<attribútumok>) ÁruCsoportok (ÁruCsopKod, Név); Anyagok (AnyagKod, Név), Kinek (KinekKod, Név) Gyártók (GyártóID, Név, Cím); Üzletek (ÜzletID, Név, Cím, TelefonSzám) Modellek (ModellID, Név, ÁruCsopKod, KinekKod, FelsrészAnyagKod, BélésAnyagKod, TalpAnyagKod, GyártóID)
Gyárt (ModellID, Szám, Szín, GyártásiÁr) Árul (ÜzletID, ModellID, Szám, Szín, EladásiÁr, DbRaktáron) CREATE TABLE Gyárt ( ModellID INT, Szám INT, Szín VARCHAR(15), GyártásiÁr REAL, PRIMARY KEY (ModellID, Szám, Szín) );
CREATE TABLE Arul ( UzletID INT, ModellID INT, Szám INT, Szín VARCHAR(15), GyártásiÁr REAL, PRIMARY KEY (UzletID, ModellID, Szám, Szín) FOREIGN KEY (ModellID, Szám, Szín) REFERENCES Gyárt (ModellID, Szám, Szín), );
Hivatkozási épség fenntartása Ha küls kulcsot deklarálunk, azt jelenti, hogy a küls kulcs bármely nem-null értéke el kell hogy forduljon a hivatkozott reláció megfelel attribútumában. Az ABKR három lehetséges megoldást ajánl az adatbázis tervezjének, ahhoz, hogy ezt a megszorítást az adatbázis módosításai közben fenn tudja tartani.
1) Alapértelmezés szerinti eljárás: ha a feltétel megsérülne a módosítást az ABKR visszautasítja. 2) Továbbgyrz eljárás (CASCADE): a hivatkozott (apa) táblában történ törlés és módosítás esetén alkalmazható. A törölt sorral együtt a hivatkozott (apa) táblából törli a neki megfelel értékeket a hivatkozó (fiú) táblából. Ha módosítunk egy értéket a hivatkozott (apa) táblában, az ABKR módosítja a hivatkozó (fiú) táblában is a megfelel értékeket. 3) NULL értékre állítás módszere (SET NULL): a törölt vagy módosított apa sorhoz tartozó fiú sorokban a küls kulcs értékét NULLra változtatja.
példa: CREATE TABLE Szállít ( SzállID INT REFERENCES Szállítók (SzállID) ON DELETE SET NULL ON UPDATE CASCADE, ÁruID INT REFERENCES Áruk (ÁruID) ON DELETE SET NULL ON UPDATE CASCADE, Ár REAL, PRIMARY KEY (SzállID, ÁruID) );
Egymásra hivatkozás CREATE TABLE Alkalmazottak ( SzemSzám INT, Név VARCHAR(30), Fizetés REAL, SzülDat DATE DEFAULT 1900-01-01, RészlegID INT NOT NULL REFERENCES Részlegek (RészlegID), ); CREATE TABLE Részlegek ( RészlegID INT, Rnév VARCHAR(20), ManagerSzemSzám INT NOT NULL REFERENCES Alkalmazottak (SzemSzám));
Beállíthatjuk-e ezt az egymásra hivatkozást? Az SQL2 ad erre lehetséget, úgy, hogy egy tranzakció keretén belül illesztenénk be egy sort a Részlegek táblába és az adott részleg managerét pedig az Alkalmazottak táblába és csak utána ellenrzi az ABKR a hivatkozási épséget, miután mind a két sort beillesztette a táblákba. Tranzakció végén ellenrzött megszorítást a DEFERED kulcsszó segítségével adhatjuk meg, a megszorítás deklarálásában. Más megoldás: az egyik tábla esetében engedjünk NULL értéket a küls kulcsnak. Például a Részlegek relációban a ManagerSzemSzám attribútum értéke lehet NULL.
Attribútumértékekre vonatkozó megszorítások a relációséma definálásakor adhatók meg. 1) attribútum értéke nem lehet NULL. NOT NULL kulcsszó-val CREATE TABLE Áruk ( ÁruID INT PRIMARY KEY, ÁruNév CHAR(30) NOT NULL, MértEgys CHAR(10) ); Fontos: Egyedi kulcs értéke sohasem lehet NULL, mivel így elveszítené azonosító szerepét. Az ABKR-ek általában nem engedik meg, hogy egyedi kulcsnak deklaráljunk olyan attribútumot, mely értéke lehet NULL.
2) Bonyolultabb megszorítás rendelhet egy attribútumhoz a CHECK kulcsszó segítségével. CREATE TABLE Csoportok ( CsopKod CHAR(3) PRIMARY KEY, Evfolyam INT CHECK (Evfolyam >= 1 and Evfolyam <= 5), SzakKod CHAR(3) ); vagy, csak a kérdéses sort megismételve: Evfolyam INT CHECK (Evfolyam IN (1, 2, 3, 4, 5)), Az ABKR visszautasítja azokat a hozzáillesztéseket, módosításokat, ahol ez a feltétel nem áll fenn.
Értéktartományokra vonatkozó megszorítások Egy attribútum értékeit úgy is korlátozhatjuk, hogy deklarálunk egy értéktartományt, és ezt az értéktartományt adjuk meg az attribútum típusaként. példa: Az Evfolyam lehetséges értékeit megadhatjuk az EvfolyamErtekek nev értéktartomány segítségével: CREATE DOMAIN EvfolyamErtekek INT CHECK (VALUE >= 1 and VALUE <= 5); A CREATE TABLE-ben a megfelel sor: Evfolyam EvfolyamErtekek,
Globális megszorítások Egy megszorítás hivatkozhat több attribútumra is, és akár több relációt érint feltételeket is tartalmazhat. 1) Sorra vonatkozó CHECK feltételek, amelyek egyetlen reláció soraira tesznek megszorításokat. példa: Kikötjük, hogy egy manager fizetése legalább 500 euró kell legyen.
CREATE TABLE Alkalmazottak ( SzemSzám INT PRIMARY KEY, Név CHAR(30), RészlegID INT REFERENCES Részlegek (RészlegID), Fizetés INT); CREATE TABLE Részlegek ( RészlegID INT PRIMARY KEY, RNév CHAR(30), ManagerSzemSzám INT REFERENCES Alkalmazottak (SzemSzám), CHECK (ManagerSzemSzám NOT IN (SELECT SzemSzám FROM Alkalmazottak WHERE Fizetés < 500) ) );
2) Önálló megszorítások, amelyek a feltételükben teljes relációkat vagy ugyanazt a relációt befutó több sorváltozót is tartalmazhatnak. CREATE ASSERTION utasítás segítségével adhatjuk meg és különálló sémaelemek lesznek. példa: A fenti példát megadhatjuk önálló megszorításként is a következképpen: CREATE ASSERTION ManagerFizetes CHECK (NOT EXISTS (SELECT * FROM Alkalmazottak, Részlegek WHERE SzemSzám = ManagerSzemSzám AND Fizetés < 500) ); A megszorítások nagyon komplexek lehetnek.
Megszorítások módosítása Ahhoz, hogy módosítani, törölni tudjunk egy megszorítást, nevet kell adjunk neki. A CREATE ASSERTION esetén az utasítás részeként adtuk meg a nevet. A többi megszorítás esetén a CONTRAINT kulcsszó segítségével adhatunk neki nevet. Példa: RészlegID INT CONSTRAINT PK_Reszleg PRIMARY KEY,
Attribútumra vonatkozó megszorításnak is adhatunk nevet: Evfolyam INT CONSTRAINT EgyOt CHECK (Evfolyam >= 1 and Evfolyam <= 5), Táblához rendelt megszorításokat az ALTER TABLE utasítás segítségével, azon belül a DROP CONSTRAINT kulcsszóval törölhetjük. ALTER TABLE Csoportok DROP CONSTRAINT EgyOt; Táblához rendelhetünk plusz megszorításokat, a tábla deklaráció után is az ALTER TABLE utasítással, ADD CONSTRAINT kulcsszó segítségével. ALTER TABLE Csoportok ADD CONSTRAINT EgyOt CHECK (Evfolyam >= 1 and Evfolyam <= 5);
Ajánlott nevet adni a hivatkozási épség megszorításoknak is, hogy törölhessük ket, esetleg újakat értelmezhessünk, anélkül, hogy a tábladeklarációt megváltoztatnánk. ALTER TABLE Alkalmazottak ADD CONSTRAINT FK_AlkReszl FOREIGN KEY (RészlegID) REFERENCES Részlegek (RészlegID), ALTER TABLE Alkalmazottak DROP CONSTRAINT FK_AlkReszl
Az önálló megszorításokat a DROP ASSERTION utasítással törölhetjük. DROP ASSERTION ManagerFizetes;