kitsendus sarnaneb register, kuid seda saab kasutada ka teise tabeliga seos loomiseks.
CONSTRAINT-klauslit kasutatakse lausetes ALTER TABLE ja CREATE TABLE kitsenduste loomiseks või kustutamiseks. CONSTRAINT-klausleid on kahte tüüpi: üks on mõeldud kitsenduse loomiseks ühel väljal ja teine kitsenduse loomiseks mitmel väljal.
Märkus.: Microsoft Accessi andmebaasimootor ei toeta CONSTRAINT-klauslit ega ühtegi andmekirjelduskeeles lauset muudes andmebaasides peale Microsoft Accessi andmebaaside. Selle asemel kasutage DAO Create-meetodeid.
Süntaks
Ühe välja kitsendus:
CONSTRAINT nimi {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES välistabel [(välisväli1, välisväli2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
Mitme välja kitsendus:
CONSTRAINT nimi
{PRIMARY KEY (primaar1[, primaar2 [, ...]]) |
UNIQUE (kordumatu1[, kordumatu2 [, ...]]) |
NOT NULL (mittetühi1[, mittetühi2 [, ...]]) |
FOREIGN KEY [NO INDEX] (viide1[, viide2 [, ...]]) REFERENCES välistabel [(välisväli1 [, välisväli2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
CONSTRAINT-klausel koosneb järgmistest osadest.
Osa |
Kirjeldus |
nimi |
Loodava kitsenduse nimi. |
primaar1, primaar2 |
Selle välja nimi või nende väljade nimed, millele määratakse primaarvõti. |
kordumatu1, kordumatu2 |
Selle välja nimi või nende väljade nimed, mis määratakse kordumatuks võtmeks. |
mittetühi1, mittetühi2 |
Selle välja nimi või nende väljade nimed, mis tohivad sisaldada ainult mittetühja väärtust. |
viide1, viide2 |
Selle välisvõtmevälja nimi või nende välisvõtmeväljade nimed, mis viitavad muudes tabelites olevatele väljadele. |
välistabel |
Selle välistabeli nimi, mis sisaldab parameetris välisväli määratud välja või välju. |
välisväli1, välisväli2 |
Välistabeli nende väljade nimed, mis on määratud parameetrites viide1 ja viide2. Võite selle klausli välja jätta, kui viidatud väli on välistabeli primaarvõti. |
Märkused
Ühe välja kitsendamise süntaksit kasutatakse lausete ALTER TABLE või CREATE TABLE välja määratlemise klauslis, mis järgneb lauses välja andmetüübi määrangule.
Mitme välja kitsendamise süntaksit kasutage siis, kui kasutate reserveeritud sõna CONSTRAINT lausetes ALTER TABLE või CREATE TABLE väljaspool väljadefinitsiooni klauslit.
CONSTRAINT-klausli abil saate väljale määrata ühe järgmistest kitsendustüüpidest.
-
Välja kordumatuks võtmeks määramise jaoks saate kasutada reserveeritud sõna UNIQUE. See tähendab, et kahel tabeli kirjel ei saa olla sellel väljal sama väärtust. Kordumatuks saate kitsendada kõiki välju või väljaloendeid. Kui mitme välja kitsendus on määratud kordumatuks võtmeks, peavad kõigi indeksisse kuuluvate väljade kombineeritud väärtused olema kordumatud isegi siis, kui kaks või enam kirjet on sama väärtusega üksnes ühel väljal.
-
Reserveeritud sõnu PRIMARY KEY saate kasutada tabelis ühe välja või väljade kogumi määramiseks primaarvõtmeks. Kõik primaarvõtme väärtused peavad olema kordumatud ega tohi olla väärtusega Null ning ühe tabeli kohta võib olla ainult üks primaarvõti.
Märkus.: Ärge määrake kitsendust PRIMARY KEY sellisele tabelile, millel juba on primaarvõti, muidu tekib tõrge.
-
Reserveeritud sõnu FOREIGN KEY saate kasutada mõne välja välisvõtmeks määramise jaoks. Kui välistabeli primaarvõti koosneb mitmest väljast, tuleb teil kasutada mitme välja kitsenduse määratlust, kus on loendatud kõik viitavad väljad, välistabeli nimi ning viitavate väljadega samas järjekorras välistabeli viidatavate väljade nimed. Kui viidatavad väljad on välistabeli primaarvõtmeks, ei pea te viidatavaid välju määrama. Vaikimisi peab andmebaasimootor viidatavateks väljadeks välistabeli primaarvõtit.
Välisvõtme kitsendused määratlevad teatud toimingud, mida tehakse siis, kui vastava primaarvõtme väärtust muudetakse.
-
Saate määratleda välistabeliga tehtavad toimingud, mis vastavad primaarvõtmega tehtud toimingutele tabelis, mille kohta on määratletud CONSTRAINT-klausel. Vaadake näiteks järgmist määratlust tabeli Kliendid jaoks.
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
Vaadake järgmist tabeli Tellimused määratlust, mis määratleb tabeli primaarvõtmele viitava välisvõtme seose:
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
Klauslid ON UPDATE CASCADE ja ON DELETE CASCADE on mõlemad välisvõtmes määratletud. Klausel ON UPDATE CASCADE tähendab, et kui kliendi identifikaatorit (Kliendi_Id) tabelis Kliendid värskendatakse, siis värskendatakse seda tabeli Tellimused kaudu. Iga tellimust, mis sisaldab vastavat kliendi ID väärtust, värskendatakse automaatselt uue väärtusega. Klausel ON DELETE CASCADE tähendab, et kui klient kustutatakse tabelist Kliendid, siis kustutatakse ka kõik read tabelis Tellimused, mis sisaldavad sama kliendi ID väärtust.
Kaaluge tabeli Tellimused määratlemiseks järgmist näidet, kus kasutatakse toimingu CASCADE asemel toimingut SET NULL.
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
Klausel ON UPDATE SET NULL tähendab seda, et kui kliendi ID-d (Kliendi_Id) tabelis Kliendid värskendatakse, siis seatakse vastavad välisvõtmeväärtused tabelis Tellimused automaatselt väärtusele NULL. Samamoodi tähendab klausel ON DELETE SET NULL seda, et kui klient tabelist Kliendid kustutatakse, siis seatakse tabeli Tellimused kõigi vastavate välisvõtmete väärtuseks NULL.
Välisvõtmete indeksite automaatse loomise vältimiseks saab kasutada modifikaatorit NO INDEX. Seda välisvõtme määratlusvormi tuleks kasutada üksnes siis, kui tekkivaid indeksväärtusi sagedasti dubleeritakse. Kui välisvõtme indeksi väärtusi sagedasti dubleeritakse, pole indeksi kasutamine nii tõhus kui tabeli skannimine. Tabelis, kus pidevalt lisatakse ja kustutatakse ridu, vähendab seda tüüpi indeksi säilitamine jõudlust ega too mingisugust kasu.