Tabelite vahelised seosed

Ühes andmebaasitabelis hoitakse üldjuhul ainult ühte liiki andmeid, mille kohta annab soovitavalt selge seletuse ka tabeli pealkiri. Kui on tunda, et lisanduvad andmed ei taha enam selle pealkirja või olemasolevate väljade peale ära mahtuda, siis enamasti on targem uus tabel teha. Tabelite rohkust ei pea pelgama. Pigem on kasulik teha mitu tabelit, kui ühte tabelisse suruda kokku mitmesuguseid väärtusi, mis sinna ei taha passida.

Samuti on mõistlik tabeleid lisada, kui paistab, et samu andmeid tuleks muidu lisada korduvalt. Ühelt poolt tekitab samade andmete korduv sisestamine ohu, et kusagil tehakse sisestamisel viga ning selle tulemusena näidatakse tulevikus kord õigeid, kord valesid andmeid. Teiseks ühekordse sisestuse eeliseks on, et andmete muutumisel piisab muutusest vaid ühes kohas.

Enamasti on andmebaasides tabelid omavahel ühendatud. Siin näites koostame lemmikloomade tabeli, kus iga looma juures võib lisaks nimele olla pikkus, mass, sünniaeg. Samas igal lemmikloomal on peremees, kel on enesel nimi, isikukood ja muud inimesele omased tunnused. Kui püütaks kõik andmed ühte tabelisse kokku toppida, siis tuleks iga uue lemmiklooma puhul kirjutada uuesti ka tema peremehe andmed – muidu jääksid vastavad lahtrid lihtsalt tühjaks ja poleks kindel, kelle juurde loom kuulub. Et aga lemmiklooma peremeheks sobivad inimesed on eraldi tabelis juba kirjas, piisab, kui lisada iga looma juurde tema peremehe id-number ning ongi üheselt looma peremees määratud.

Järgnevalt siis lemmikloomade tabeli loomiskäsk. Igale tabelile iseloomulikult id-tulp isesuureneva primaarvõtmena, et oleks kindel järjekorranumber, mille kaudu loomale viidata. Looma nimi – tekst pikkusega kuni 50 sümbolit. Arv peremehe id-numbri meelespidamiseks. Ning lõpuks teade baasile

[crayon-68109a147a9ad178310501/]

ehk siis võõrvõti (väärtus lemmikloomade väljast peremehe_id) näitab tabeli Laps tulbale LapsID.

Selle lause järgi oskab SQL Server kontrollida, et tabelisse lubatakse lisada vaid lemmikloomi, kelle peremehe_id näitab tabelis olemasolevale lapsele.

[crayon-68109a147a9b5253622564/]

Andmete lisamine INSERT lause abil nagu igal pool mujalgi. id-tulba väärtuse määrab programm ise, loomanimi ja peremehe identifikaator antakse ette lausega. Kui vastava järjekorranumbriga peremees on tabelis olemas, siis õnnestub kõik ilusti.

[crayon-68109a147a9b8650492638/]

Madis ehk tegelane number kuus sai aga eespool tabelist kustutatud. Kui nüüd püütakse Muri kirja panna Madise koerana, siis annab arvuti vastu veateate.

[crayon-68109a147a9bb561038641/]

Öeldakse, et sisestatud võõrvõti ei sobi tabeli lapsed veeru id väärtusega. Ning Muri jääb sisestamata. Selle üle võib veenduda ka lemmikloomade tabelist andmeid küsides:

[crayon-68109a147a9be235385199/]

Ehk siis said kirja Miisu ja Pauka, aga mitte Muri. Sest Muri puhul polnud võimalik üles märkida tabelis kirjas olevat peremeest.

Seoseid on võimalik luua ka juba valmis tabelite vahele. Selleks tuleb tabelit muuta ALTER TABLE käsuga. Näiteks kui soovime luua seose tabelite Laps_tbl ja Linn_tbl vahele võiksime kasutada järgmist konstruktsiooni:

[crayon-68109a147a9c1070982065/]

Nagu näha saab välisvõtmele lisada juurde ka käitumisreeglid juhuks kui peatabelis võti muutub või kustub. Valikuid tegevusteks on neli:

  • NO ACTION – ei tehta midagi st kui Laps tabelis on mõnel lapsel linn, mida üritatakse kustutada siis kustutamine katkestatakse ning antakse veateade
  • CASCADE – antakse edasi e. kui kustutad/muuta linna kustuvad/muutuvad automaatselt (ILMA HOIATUSTETA) ka kõik selle linna lapsed
  • SET NULL – kui kustub/muutub linn pannakse kõigi selle linna laste sünnilinnaks NULL e. määramata. See eeldab, et NULL väärtused on lubatud-
  • SET DEFAULT – kui linn kustub/muutub siis taastatakse lastel vaikimisi määratud e DEFAULT linnad. Kui DEFAULT on määramata üritatakse panna NULL väärtust. Kui ka see ei õnnestu siis tegevus katkestatakse.