von Petra Páncsity Vor 7 Jahren
242
Mehr dazu
CREATE TABLE JATEKOSOK(
ID NUMBER(3)
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,MEZSZAM NUMBER(2) CHECK
,CSAPAT NUMBER(3) REFERENCES CSAPAT (TID)
,CONSTRAINT jatekos_id_pk PRIMARY KEY(ID)
,CONSTRAINT jatekos_csapat_fk FOREIGN KEY (ID) REFERENCES CSAPAT(TID)
);
CREATE TABLE CSAPAT(
TID NUMBER(3)
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
,CONSTRAINT csapat_tid_pk PRIMARY KEY (TID)
);
------------------------------------------------------------------------
Előadás alapján példa 7. lehetőségre:
CREATE TABLE JATEKOSOK(
ID NUMBER(3) CONSTRAINT jatekos_id PRIMARY KEY
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,MEZSZAM NUMBER(2)
,CSAPAT NUMBER(3)
,CONSTRAINT csapatid_fk FOREIGN KEY (csapat) REFERENCES csapat
);
Forrás: saját példa
A jatekosok tábla csapat oszlopa hivatkozik a csapat tábla tid oszlopára, csak olyan értékeket írhatok a csapat oszlopba, ami a tid-ben is megtalálható:
CREATE TABLE JATEKOSOK(
ID NUMBER(3) PRIMARY KEY
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,MEZSZAM NUMBER(2) CHECK
,CSAPAT NUMBER(3) REFERENCES CSAPAT (TID)
);
CREATE TABLE CSAPAT(
TID NUMBER(3) PRIMARY KEY
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
);
Forrás: saját
Csak táblázat feltételnél adhatjuk meg.
Master-Detail kapcsolat
ON DELETE CASCADE:
"Definiálja, hogy ha az idegen kulccsal hivatkozott rekordot törlik a hivatkozott táblázatból, akkor az összes rá hivatkozó rekord is törlődik a hivatkozó táblázatból. Ha nem adjuk meg sem ezt, sem az ON DELETE SET NULL klauzulát, akkor a hivatkozott táblázatból olyan rekordot, amelyikre hivatkozás van, nem lehet törölni."
Forrás: Quittner - Baksa-Haskó: Adatbázisok, adatbázis-kezelő rendszerek
Ugyanaz, mint az előbb, csak out-of-line adom meg:
CREATE TABLE CSAPAT(
TID NUMBER(3) PRIMARY KEY
,NEV VARCHAR2(25)
,ALAPITAS DATE
,CONSTRAINT csapat_nev_uq UNIQUE(NEV)
);
A nev oszlopban csak egyedi értékek megengedettek:
CREATE TABLE CSAPAT(
TID NUMBER(3) PRIMARY KEY
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
);
Forrás: saját
Olyan kulcs, amely nem a tábla elsődleges kulcsa. Kizárólag egyedi értékeket enged meg.
NULL értékkel nem szegjük meg az egyediséget.
Forrás: előadás
Maximum egy ilyen lehet egy táblában. Egyedi értéknek kell lennie, vagyis nem lehet két azonos sor. Nem tartalmazhat NULL értéket.
Forrás: előadás
CREATE TABLE JATEKOSOK(
ID NUMBER(3)
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,NEM VARCHAR2(1) CHECK (NEM='F' OR NEM='N')
,MEZSZAM NUMBER(2) CHECK
,CSAPAT NUMBER(3) REFERENCES CSAPAT (TID)
,CONSTRAINT jatekos_id_pk PRIMARY KEY(ID)
);
CREATE TABLE CSAPAT(
TID NUMBER(3)
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
,CONSTRAINT csapat_tid_pk PRIMARY KEY (TID)
);
Forrás: saját példa
CREATE TABLE JATEKOSOK(
ID NUMBER(3) CONSTRAINT jatekos_id_pk PRIMARY KEY
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,NEM VARCHAR2(1) CHECK (NEM='F' OR NEM='N')
,MEZSZAM NUMBER(2)
,CSAPAT NUMBER(3) REFERENCES CSAPAT (TID)
);
CREATE TABLE CSAPAT(
TID NUMBER(3) PRIMARY KEY
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
);
Forrás: saját példa
Összetett kulcsnak is nevezik.
A sorszam+datum oszlop összetett kulcs:
CREATE TABLE foglalas(
sorszam NUMBER(4)
,datum DATE DEFAULT TRUNC(SYSDATE) NOT NULL
,nev VARCHAR2(50)
,ar NUMBER(6)
,CONSTRAINT uq_sorsz_date UNIQUE (sorszam, datum)
);
Forrás: előadás + saját példa
out-of-line
CREATE TABLE JATEKOSOK(
ID NUMBER(3) CONSTRAINT jatekos_id PRIMARY KEY
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,NEM VARCHAR2(1)
,MEZSZAM NUMBER(2) CHECK
,CSAPAT NUMBER(3) REFERENCES CSAPAT (TID)
,CONSTRAINT jatekos_nem CHECK (NEM='F' OR NEM='N')
);
CREATE TABLE CSAPAT(
TID NUMBER(3)
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
);
CREATE TABLE JATEKOSOK(
ID NUMBER(3) CONSTRAINT jatekos_id PRIMARY KEY
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,NEM VARCHAR2(1) CHECK (NEM='F' OR NEM='N')
,MEZSZAM NUMBER(2) CHECK
,CSAPAT NUMBER(3) REFERENCES CSAPAT (TID)
);
A nem oszlopban csak F és N értékeket engedek meg.
Forrás: saját példa
Tábla egy sorára vonatkozik. Logikai kifejezés, külön-külön minden sorra igaznak kell lennie.
Forrás: előadás
inline
Két táblából álló adatbázis, amely kézilabda játékosokat és csapatokat tartalmaz:
CREATE TABLE JATEKOSOK(
ID NUMBER(3) CONSTRAINT jatekos_id PRIMARY KEY
,VNEV VARCHAR2(16) NOT NULL
,KNEV VARCHAR2(16) CONSTRAINT jatekos_knev NOT NULL
,NEM VARCHAR2(1) CHECK (NEM='F' OR NEM='N')
,MEZSZAM NUMBER(2)
,CSAPAT NUMBER(2) REFERENCES CSAPAT (TID)
);
CREATE TABLE CSAPAT(
TID NUMBER(2)
,NEV VARCHAR2(25) UNIQUE
,ALAPITAS DATE
);
Forrás: saját példa
A tábla egy oszlopára vonatkozik.
Nem engedélyezi az adott oszlopban a NULL értéket.
A CHECK speciális esetének is tekinthető.
Forrás: előadás diái
Tranzakciós működési probléma:
Ha több felhasználó dolgozik egy adatbázison a változtatások csak commitolás után válnak láthatóvá a többieknek.
Forrás: előadáson elhangzott
Ha adatmódosítással szabályt szegnénk, akkor azt azonnal megakadályozza.
Forrás: előadás
Egyes adatbáziskezelő rendszereknél kötelező, míg másoknál ajánlott az index.
"Ahhoz, hogy egy táblázatra idegen kulccsal hivatkozhassunk, a táblázatnak léteznie kell, a hivatkozott oszlopokon elsődleges kulcs vagy egyedi index kell legyen és REFERENCES jogosultságunk kell legyen rá."
Forrás: előadás
Quittner - Baksa-Haskó: Adatbázisok, adatbázis-kezelő rendszerek
Forrás: előadás
A kényszereket a DML utasítás végén ellenőrzik az adatbáziskezelő rendszerek. Ha megszegnénk a kényszert a DML uatsítást hibaüzenettel elutasítják.
Ha előbb a szülő táblába, majd utána a gyerek táblába visszük be az adatokat -> sikerül
Viszont ha fordítva akarom bevinni az adatokat, akkor hibaüzenetet ír ki:
"a szülő kulcs nem található".
Hibaüzenet (kép):
https://flic.kr/p/SMv1Ns
Ha az adatok bevitelekor kihagyom az oszlopot (megengedi a NULL értéket), ami a másik táblára hivatkozik, sikerül az adatok beszúrása.
Forrás: előadás + saját
PRIMARY KEY és UNIQUE kényszer nem dobható el, ha FOREIGN KEY megszorításban hivatkozunk rá.
Szülő tábla sem dobható el.
Hibaüzenet (kép):
https://flic.kr/p/T2gj8K
Az hibaüzenet alapján nem sikerült eldobni az elsődleges kulcsot, mivel más idegen kulcsok hivatkoznak rá.
Forrás: előadás + saját
A mufajok tábla nev oszlophoz tartozó UNIQUE kényszert eldobom:
ALTER TABLE mufajok DROP CONSTRAINT nev_uq;
----------------------------------------------
Kényszer megszüntetése:
ALTER TABLE filmek DISABLE CONSTRAINT mufaj_fk;
Forrás: saját példa
DROP TABLE utasítással
Filmek tábla eldobása:
DROP TABLE filmek;
Ha olyan táblát próbálnék eldobni, aminek az elsődleges kulcsa egy másik táblának az idegen kulcsa, nem sikerülne.
Hibaüzenet (kép):
https://flic.kr/p/RMyNMz
(Megpróbáltam eldobni a csapat táblát, de az id oszlop a jatekosok tábla egyik oszlopának az idegen kulcsa.)
Forrás: előadás, saját
foreign key
primary key
not null
Kezdetben létrehoztam két táblát (mufajok és filmek), majd ezeket fogom módosítani:
CREATE TABLE mufajok(
azon NUMBER(2) PRIMARY KEY
,nev VARCHAR2(16) NOT NULL
,CONSTRAINT nev_uq UNIQUE (nev)
);
CREATE TABLE filmek(
id NUMBER(2)
,cim VARCHAR2(25) NOT NULL
,rendezo VARCHAR2(50) NOT NULL
,ev DATE
,mufaj NUMBER(2)
,CONSTRAINT id_pk PRIMARY KEY(id)
,CONSTRAINT mufaj_fk FOREIGN KEY(mufaj) REFERENCES mufajok (azon)
);
A Filmek tábla módosításával a cim oszlophoz hozzáadok egy NOT NULL kényszert:
ALTER TABLE filmek ADD (
CHECK (cim IS NOT NULL)
);
----------------------------------------------
Kényszer engedélyezése (feltéve, hogy előtte megszüntettem a kényszert):
ALTER TABLE filmek ENABLE CONSTRAINT mufaj_fk;
Forrás: saját példa
CREATE TABLE filmek(
id NUMBER(2)
,cim VARCHAR2(25)
,rendezo VARCHAR2(50) NOT NULL
,ev DATE
,mufaj NUMBER(2)
,CONSTRAINT id_pk PRIMARY KEY(id)
);
Forrás: saját példa