Kényszerek megadása. Indexek kezelése.
A kényszerek (CONSTRAINT) típusai PRIMARY KEY: a kulcsmezők megadása (csak egyedi értékük lehet) FOREIGN KEY: idegen kulcs megadása (egy másik tábla kulcsában elő kell fordulnia) CHECK: egyéb elvégzendő ellenőrzés Bonyolultabb kényszerek megadásához adatbázis-triggereket lehet használni
Kulcs megadása
Egyszerű kulcs megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [CONSTRAINT kényszernév] PRIMARY KEY [, oszlopnév adattípus …]); Példa: CREATE TABLE hallgato ( nev VARCHAR2(30) CONSTRAINT hallg_kulcs PRIMARY KEY, szul_dat DATE, evfolyam NUMBER(1) );
(Összetett) kulcs megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [, oszlopnév adattípus …], [CONSTRAINT kulcsnév] PRIMARY KEY (oszlopok)); Példa: CREATE TABLE hallgato ( nev VARCHAR2(30), szul_dat DATE, evfolyam NUMBER(1), CONSTRAINT hallg_kulcs PRIMARY KEY (nev, szul_dat));
Kulcs megadása utólag Alakja: ALTER TABLE táblanév ADD [CONSTRAINT kulcsnév] PRIMARY KEY (oszlopok); Példa: ALTER TABLE hallgato ADD CONSTRAINT hallg_kulcs PRIMARY KEY (nev, szul_dat);
Idegen kulcs megadása
Egyszerű idegen kulcs megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [CONSTRAINT kulcsnév] REFERENCES táblanév[(oszlopnév)] [, oszlopnév adattípus …]); Példa: CREATE TABLE krend ( … vevokod VARCHAR2(8) NOT NULL REFERENCES vevok, …
(Összetett) idegen kulcs megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [, oszlopnév adattípus …], [CONSTRAINT kulcsnév] FOREIGN KEY (oszlopok) REFERENCES táblanév[(oszlopok)]); Példa: CREATE TABLE krend (…, CONSTRAINT krend_vevo_id_kulcs FOREIGN KEY (vevokod) REFERENCES vevok(vevokod));
Egyszerű idegen kulcs megadása utólag Alakja: ALTER TABLE táblanév MODIFY (oszlopnév adattípus [CONSTRAINT kulcsnév] REFERENCES táblanév[(oszlopnév)]; Példa: ALTER TABLE krend MODIFY (vevokod VARCHAR2(8) NOT NULL REFERENCES vevok); ORACLE-ben nem megy!
Idegen kulcs megadása utólag Alakja: ALTER TABLE táblanév ADD [CONSTRAINT kulcsnév] FOREIGN KEY (oszlopok) REFERENCES táblanév[(oszlopok)]; Példa: ALTER TABLE krend ADD CONSTRAINT krend_vevo_id_kulcs FOREIGN KEY (vevokod) REFERENCES vevok(vevokod);
Ellenőrző kényszer megadása
Egy mezőre vonatkozó ellenőrzés megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [CONSTRAINT kulcsnév] CHECK (feltétel) [, oszlopnév adattípus …]); Példa: CREATE TABLE hallgato ( nev VARCHAR2(30), szul_dat DATE CHECK (szul_dat = 1 AND evfolyam <= 4));
Több mezőre vonatkozó ellenőrzés megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [, oszlopnév adattípus …]) [CONSTRAINT kulcsnév] CHECK (feltétel); Példa: CREATE TABLE hallgato ( nev VARCHAR2(30), szul_dat DATE, evfolyam NUMBER(1)) CONSTRAINT eleg_idos CHECK (YEAR(szul_dat)+evfolyam + 17 <= YEAR(SYSDATE)); legkorábban 18 éves korában lehet 1. éves, 19 éves korában 2. éves, stb.
Több mezőre vonatkozó ellenőrzés megadása a táblával együtt Alakja: CREATE TABLE táblanév (oszlopnév adattípus [, oszlopnév adattípus …], [CONSTRAINT kulcsnév] CHECK (feltétel)); Példa: CREATE TABLE hallgato ( nev VARCHAR2(30), szul_dat DATE, evfolyam NUMBER(1), CONSTRAINT eleg_idos CHECK (TO_CHAR(szul_dat, ‘YYYY’)+evfolyam+17 <= 2006)); legkorábban 18 éves korában lehet 1. éves, 19 éves korában 2. éves, stb. kényszerben a SYSDATE nem használható
Egymezős ellenőrzések megadása utólag Példa: CREATE TABLE Persons ( P_Id int NOT NULL CHECK (P_Id>0), LastName varchar2(255) NOT NULL, FirstName varchar2(255), Address varchar2(255), City varchar2(255) )
Több mezős ellenőrzések megadása utólag CREATE TABLE Hallgató ( P_Id int NOT NULL, LastName varchar2(255) NOT NULL, FirstName varchar2(255), Address varchar2(255), City varchar2(255), CONSTRAINT chk_Person CHECK (P_Id>0 AND City=‘Pécs') )
Ellenőrzés megadása utólag Alakja: ALTER TABLE táblanév ADD [CONSTRAINT kulcsnév] CHECK (feltétel); Példa: ALTER TABLE Hallgató ADD CHECK (P_Id>0) Példa 2 ALTER TABLE Hallgató ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Pécs')
Gyakori feltételek ellenőrzésnél 1. Egyszerű összehasonlítás –CHECK (x <= 0)-- x nem pozitív –CHECK (x = y)-- x = y –CHECK (x <> ‘C’)-- x nem egyenlő ‘C’-vel Intervallum belseje –CHECK (x >= 0 AND x =0 és x<=10 –CHECK (x BETWEEN 0 AND 10)-- ugyanaz Intervallum külseje –CHECK (x 10)-- x 10 –CHECK (x NOT BETWEEN 0 AND 10)-- ugyanaz
Gyakori feltételek ellenőrzésnél 2. Szöveg hasonlítása mintához –CHECK (x LIKE ‘A_b%’) (x első karaktere A, harmadik karaktere b) Előfordulás felsorolásban –CHECK (x IN (‘a’, ‘b’, ‘c’))-- a vagy b vagy c –CHECK (x IN (SELECT nev FROM hallgato)) (x előfordul a HALLGATO tábla NEV oszlopában) Kizárás felsorolásból –CHECK (x NOT IN (1, 2, 3))-- nem 1, 2 vagy 3 _ egy tetszőleges karakter % akárhány tetszőleges kar.
Egyéb teendők a kényszerekkel
Saját kényszereink adatai USER_CONSTRAINTS view A fontosabb adatok felsoroltatása: SELECTconstraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name=‘RENDEL’; A constraint_type mező jelentése: C: check, P: primary key, R: foreign key (reference) A “NOT NULL” kikötések miatt is létrejöttek “C” típusú kényszerek!
Kényszer törlése Formái: ALTER TABLE táblanév DROP CONSTRAINT kényszernév; ALTER TABLE táblanév DROP PRIMARY KEY; Példa: ALTER TABLE hallgato DROP CONSTRAINT joevfolyam;
Jó tudni … A rendszer a kényszerek teljesülését minden rekord létrehozásakor, törlésekor vagy módosításakor ellenőrzi Tömeges adatmódosításnál (pl. adat-import) sok időt vesz igénybe A kényszerek átmenetileg kikapcsolhatók!
Indexek
Alapelvek Az indexek az adott mező(k) szerinti keresést és rendezést gyorsító segédtáblázatok (nem adattáblák!) Azokat a mezőket indexeljük, amik szerint gyakran keresünk vagy rendezünk A jó index gyorsítja a lekérdezést A kulcs szerint automatikusan készül index is A felesleges index lassítja az adatbázist - az indexek karbantartása is időbe kerül! Az idegen kulcsokat mindig indexeljük meg!
Index létrehozása Formája: CREATE [UNIQUE] INDEX indexnév ON táblanév (mezőnév [sorrend] [, mezőnév [sorrend] … ]); –sorrend: ASC = növekvő (alapértelmezés), DESC = csökkenő –UNIQUE: az index alapjául szolgáló mezők kötelezően egyediek Példa: CREATE INDEX hallg_nevsor_idx ON hallgato (nev, evfolyam DESC); –név szerint növekvő, azonos nevűeknél évfolyam szerint csökkenő sorrend
Értékek egyediségének ellenőrzése indexeléssel A mezőre UNIQUE indexet készítünk, pl. CREATE UNIQUE INDEX hallg_nev_idx ON hallgato (nev); 1:n kapcsolat esetén az idegen kulcshoz sose készítsünk UNIQUE indexet!
Index törlése Formája: DROP INDEX indexnév; Példa: DROP INDEX hallg_nevsor_idx;
Jó tudni … A rendszer az indexeket minden rekord létrehozásakor, törlésekor vagy módosításakor aktualizálja Tömeges adatmódosításnál (pl. adat-import) sok időt vesz igénybe Sokszor érdemesebb az indexeket törölni, majd az adatmódosítások után újra létrehozni!
Házi feladat SQL script készítése és végrehajtása –a példa-adatbázis kényszereinek létrehozására (a következő diákon vastag betűkkel kiemelve) –az idegen kulcsokra indexek készítésére Figyelem! Mindig előbb a kulcsot hozzuk létre, csak utána a rá hivatkozó idegen kulcsot!
A vevők adatai
A vevők adatai (VEVOK tábla)
A rendelések adatai
A rendelések adatai (RENDEL tábla)
A rendelések tételei
A rendelések tételei (RTETEL tábla)
A cikkek adatai
A cikkek adatai (CIKK tábla)