A megkötés olyan mint egy indexelés, eltekintve attól, hogy megkötéssel másik táblával is létesíthető kapcsolat.
A CONSTRAINT záradékot az ALTER TABLE és a CREATE TABLE utasításban használhatja megkötések létrehozására vagy törlésére. A CONSTRAINT záradéknak két típusa létezik: az egyikkel egy mezőre vonatkozó megkötést lehet létrehozni, a másikkal több mezőre vonatkozót.
Megjegyzés: A Microsoft Access adatbázismotor nem támogatja CONSTRAINT vagy bármilyen adatdefiníciós nyelvi utasítás használatát nem Microsoft Access-adatbázisokkal. Használjon helyettük DAO létrehozási metódusokat.
Szintaxis
Egymezős megkötés:
CONSTRAINT név {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES idegentábla [(idegenmező1, idegenmező2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
Többmezős megkötés:
CONSTRAINT név
{PRIMARY KEY (elsődleges1[, elsődleges2 [, ...]]) |
UNIQUE (egyedi1[, egyedi2 [, ...]]) |
NOT NULL (nemnull1[, nemnull2 [, ...]]) |
FOREIGN KEY [NO INDEX] (hiv1[, hiv2 [, ...]]) REFERENCES idegentábla [(idegenmező1 [, idegenmező2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
A CONSTRAINT záradék az alábbi részekből áll:
Rész |
Leírás |
név |
A létrehozandó megkötés neve. |
elsődleges1, elsődleges2 |
Az elsődleges kulcsként használandó mező vagy mezők neve. |
egyedi1, egyedi2 |
Az egyedi kulcsként használandó mező vagy mezők neve. |
nemnull1, nemnull2 |
Azon mező vagy mezők neve, melyekben nem szerepelhet Null érték. |
hiv1, hiv2 |
Az idegen kulcsként használandó mező vagy mezők neve, melyek egy másik tábla mezőire hivatkoznak. |
idegentábla |
Az idegenmező argumentummal meghatározott mezőt vagy mezőket tartalmazó idegen tábla neve. |
idegenmező1, idegenmező2 |
A hiv1 és hiv2 argumentumokkal meghatározott idegentáblában található mező vagy mezők neve. Ezt a záradékot ki lehet hagyni, ha a hivatkozott mező az idegentábla elsődleges kulcsa. |
Megjegyzések
Az egymezős megkötést az ALTER TABLE vagy a CREATE TABLE utasítás meződefiníciós záradékában kell megadni, közvetlenül a mező adattípusának meghatározása után.
A többmezős megkötési szintaxist akkor kell használni, amikor az ALTER TABLE vagy a CREATE TABLE utasításban a meződefiníciós záradékon kívül használja a foglalt szónak minősülő CONSTRAINT záradékot.
A CONSTRAINT záradékkal az alábbi típusú megkötéseket alkalmazhatja a mezőkre:
-
A UNIQUE foglalt szót használva kijelölheti a mezőt egyedi kulcsként. Ez azt jelenti, hogy a tábla ezen mezőiben két rekord értéke nem lehet ugyanaz. Bármilyen mezőt vagy mezőlistát megadhat egyedi kulcsként. Ha több mezőt definiál egyedi kulcsként, a mezők kombinált értékének kell egyedinek lennie, azaz az egyik mező több rekordban is tartalmazhatja ugyanazt az értéket.
-
A PRIMARY KEY foglalt szavakkal elsődleges kulcsként jelölhet meg egy mezőt vagy mezőkészletet egy táblában. Az elsődleges kulcs minden értékének egyedinek és nem Null értékűnek kell lennie, és egy táblához csak egy elsődleges kulcs lehet.
Megjegyzés: Ne állítson be PRIMARY KEY megkötést olyan táblához, amely már rendelkezik elsődleges kulccsal. Ha így tesz, hibát fog jelezni a rendszer.
-
Idegen kulcsként a FOREIGN KEY foglalt szót használva jelölhet meg mezőket. Ha az idegen tábla elsődleges kulcsa egynél több mezőből áll, többmezős megkötést kell használnia, felsorolva az összes hivatkozó mezőt, az idegen tábla nevét és az idegen tábla hivatkozott mezőinek a nevét ugyanabban a sorrendben, ahogy a hivatkozó mezők fel lettek sorolva. Ha a hivatkozott mező vagy mezők alkotják az idegen tábla elsődleges kulcsát, a hivatkozott mezőket nem kell megadni. Alapértelmezés szerint az adatbázismotor úgy jár el, mintha az idegen tábla elsődleges kulcsát alkotó mezők lennének a hivatkozott mezők.
Az idegen kulcs típusú megkötések meghatározott műveleteket írnak elő azokra az esetekre, amikor megváltozik az egyik kapcsolódó elsődleges kulcs értéke:
-
Megadhatja olyan műveletek végrehajtását az idegen táblán, melyek megfelelnek az elsődleges kulcson abban a táblában végrehajtott műveletnek, amelyhez a CONSTRAINT definiálva lett. Tekintse át például a Customers (Ügyfelek) elnevezésű táblára vonatkozó alábbi definíciót:
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
Most pedig tekintse meg az Orders (Rendelések) táblára vonatkozó alábbi definíciót, amely olyan idegen kulcs alapú kapcsolatot definiál, amely a Customers tábla elsődleges kulcsára hivatkozik.
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
Az idegen kulcshoz ON UPDATE CASCADE és ON DELETE CASCADE záradék is tartozik. Az ON UPDATE CASCADE záradék azt jelenti, hogy ha a Customer táblában megváltozik az egyik ügyfél azonosítója (CustId), a frissítést az Orders táblában is végrehajtja a rendszer. Ez azt jelenti, hogy automatikusan frissíteni fog minden olyan megrendelést az új értékkel, amely tartalmazza a megfelelő ügyfélazonosítót. Az ON DELETE CASCADE záradék azt jelenti, hogy ha egy ügyfelet törölnek a Customer táblából, az Orders tábla összes olyan sorát törli a rendszer, amelyben szerepel ez az ügyfél-azonosító.
Tekintse meg ezt az Orders táblára vonatkozó másik definíciót, amely a CASCADE művelet helyett a SET NULL műveletet használja:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
Az ON UPDATE SET NULL záradék hatására az egyik ügyfél azonosítójának Customer táblában történő (CustId) módosításakor az Orders tábla megfelelő idegenkulcs-értékeit automatikusan NULL értékre állítja a rendszer. Hasonlóképpen az ON DELETE SET NULL záradék hatására, egy ügyfél Customer táblából való törlésekor az Orders tábla megfelelő idegenkulcs-értékeit NULL-ra fogja állítani a rendszer.
Az idegen kulcsokhoz tartozó indexek automatikus létrehozása a NO INDEX módosítóval akadályozható meg. Idegen kulcsot csak abban az esetben érdemes ilyen módon definiálni, ha a létrejövő indexértékek gyakran ismétlődnének. Ha egy idegenkulcs-indexben gyakran ismétlődő értékek szerepelnek, az index használatánál hatékonyabb egyszerűen átvizsgálni a táblát. A sorok táblába történő beszúrásának és táblából történő törlésének követése ilyen típusú index esetén csak rontja a teljesítményt, és nem jár semmilyen előnnyel.