3. primarni i strani ključevi
TRANSCRIPT
-
7/23/2019 3. Primarni i Strani Kljuevi
1/13
Copyright Link group
Primarni i strani kljuevi
U prvoj lekciji ovog modula zapoeli smo kreiranje baze podataka. Doli smo do kreiranjatabela i tu smo zastali prilikom deinisanja tipova podataka koje kolone mogu uvati! sa imesmo se upoznali u prethodnoj lekciji. "ako bismo dovrili kreiranje tabela! potrebno je da seupoznamo sa jo nekim pojmovima! neophodnim za adekvatno kreiranje tabela.
#a znanjima iz prethodne lekcije mo$emo deinisati nazive i tipove podataka.
%odsetimo se kako je potrebno da izgleda tabela koju kreiramo. &a slici '.( je prikazandijagram iz koga )e nastati tabela product.
7.1 ER dijagram za tabelu Product
&ain na koji se dodaju tabele prikazan je u prvoj lekciji ovog modula. #a dijagrama vidimoda je potrebno kreirati tri kolone. "reirajmo ih.
7.2 Kolone tabele Product
"olone kreiramo tako to upisujemo njihove nazive u koloni Column &ame. &akon ovogadeiniemo njihove tipove. # obzirom da je kolona product_ididentiikaciona kolona u kojoj)e se uvati celobrojne vrednosti za tip podataka ove kolone odabrali smo tip *&+.
-
7/23/2019 3. Primarni i Strani Kljuevi
2/13
Copyright Link group
U koloni sa nazivom Name uva)e se nazivi proizvoda! tako da je za tip ove kolonepostavljen ,-C/-. %ostavljena je i veliina tipa ,-C/- na 01! pod pretpostavkom danaziv proizvoda ne)e biti du$i od 01 karaktera.
2a kolonu sa nazivom %rice postavljen je tip podataka Decimal. Decimal je podataka koji jenajpogodniji za uvanje novanih reprezentacija! i on prihvata parametre. 2ato smo u
zagradi dodali parametre koji ukazuju na to da )e se u ovoj koloni tabele mo)i smetatidecimalne vrednosti od (3 ciara sa leve strane i 0 cire sa desne strane pokretnog zareza.
"ada deiniemo tabelu sa ovakvom strukturom! ona )e biti validna! ali i prilino slabeupotrebljivosti. &jen osnovni problem bi)e to to )e mo)i da postoje dva ili vie proizvoda saistim imenom! cenom i identiikacionim brojem. 4to bi znailo! nepotrebno gomilanjepodataka.
Dakle! ovoj tabeli potreban je neki mehanizam koji )e da zabrani unos duplikataidentiikacionog broja. 5i smo u ovoj tabeli kreirali jednu kolonu sa nazivomproduct_id! koja)e! pretpostavljate! slu$iti upravo kao ta identiikaciona kolona o kojoj smo priali. 6vakolona )e slu$iti i kao ograniavaju)i aktor! ne dozvoljavaju)i ponavljanje istih unosa.6vakva kolona se naziva primarni klju.
Primarni klju (Primary Key)
%rimarni klju je osnovni ograniavaju)i aktor u jednoj tabeli. +o je svojstvo kolone! koje neomogu)ava da se vrednosti u njoj ponavljaju. &a ovaj nain! lako je identiikovati bilo kojired kolone! jer se u svakom od njih nalazi unikatan primarni klju. %rimarni klju jekarakteristika skoro svake tabele! iako postoji mogu)nost da se izbegne njegovopostavljanje.
%onekad! tabela mo$e imati i nekoliko kolona! koje zajedno ine primarni klju te tabele. &aprimer! ako bismo hteli da se nijedan naziv proizvoda i njegova cena ne mogu ponoviti!
mogli bismo deinisati primarni klju na kolonama price i name. *pak! naje)a je praksadeinisanje posebne kolone! specijalno za namenu primarnog kljua! kao u naem primeru.
*z svega ovoga! mo$emo da zakljuimo da je u naoj situaciji! neophodno da postavimo zaprimarni klju kolonuproduct_id.
+o mo$emo da uradimo ekiranjem opcije %" u istom redu u kojem smo deinisali kolonuproduct_id7
7.3 Postaljanje primarnog !lju"a
6vo mo$emo podesiti i u odeljku ispod! gde postoje opcije za trenutno selektovanu kolonu7
-
7/23/2019 3. Primarni i Strani Kljuevi
3/13
Copyright Link group
7.# Postaljanje primarnog !lju"a$2%
&a slici '.0 mo$emo da vidimo i znaenja skra)enice za oznake u tabeli na slici '.8.
9ekirali smo stavku %rimary "ey! to ovu kolonu deinie kao kolonu primarnog kljua.%otpuno je logino da )e jedna ovakva kolona automatski imati svojstvo &ot &ull. &a slici'.0 mo$emo da vidimo da! pored opcija za proglaavanje odre:ene kolone kao koloneprimarnog kljua! postoji i mnotvo dodatnih opcija koje se mogu primeniti na jednoj koloni.
Upoznajmo se sada sa ovim opcija redom.
&E'()*+
%ostavljanjem vrednosti u ovo tekstualno polje zapravo smo koloni dodelili podrazumevanuvrednost koju )e imati ukoliko se prilikom unosa podataka vrednost za ovu kolonu nenavede.
N,+ N)**
6va opcija deinie da )e biti neophodno da ovakva kolona prilikom unosa podataka imavrednost. +o znai da )e na primer! ukoliko pokuamo da unesemo novi proizvod u tabelu!
bez deinisanja primarnog kljua! do)i do greke. 5y#;L )e prijaviti greku! to znai da sena ovaj nain osiguravate da )e polje imati vrednost.
"olona koja je primarni klju automatski ima i &6+ &ULL svojstvo! to je potpuno logino! sobzirom da )e ovakva kolona slu$iti za identiikaciju podataka. 9ak iako pokuate daiskljuite svojstvo &6+ &ULL za ovu kolonu! bi)ete u obavezi da u njoj unesite vrednostsvaki put! ukoliko je ona podeena kao primarni klju.
)N-)E
#etovanjem ove opcije postigli smo slian eekat kao i sa svojstvom %*5-< "=
-
7/23/2019 3. Primarni i Strani Kljuevi
4/13
Copyright Link group
)N-NE&
6pciju U*?&=D je mogu)e ekirati na kolonama za koje je kao tip podataka odabran nekiod brojanih tipova. 6vom opcijom bi)e mogu)e unositi samo pozitivne brojane vrednostikao podatke takve kolone.
2=6 @*LL-ktiviranjem 2=6 @*LL opcije nad nekom kolonom mo$emo uticati na to kako )e samipodaci biti prikazani. *sto kao i u prethodnom sluaju! i ovo svojstvo se mo$e primeniti samona kolone sa brojanim tipom podataka. Ukoliko je za tip podatka jedne kolone postavljen*&+AB ovako bi izgledali neki proizvoljni podaci sa i bez aktiviranezero 4illopcije7
with zero fill without zerofill
3333333( (333333( (33333(8 (8(801E'BF (801E'BF
()+, -N5RE6EN+
,e) smo nekoliko puta naglaavali da je potrebno u tabeli koju kreiramo da postoji i jednaidentiikaciona kolona specijalno namenjena za ulogu primarnog kljua. Uistinu! ovakvukolonu smo i kreirali u dosadanjem toku lekcije. -li! ovakva kolona ne bi imala svrhu! akobi! prilikom svakog unosa podataka! trebalo mi da unosimo i redni broj podatka. 2ato sekoristi opcija -U+6 *&C=5=&+. 6na automatski unosi brojeve u ovakvu kolonu.
5i )emo ukljuiti ovu opciju! poto je ovo ponaanje koje je veoma po$eljno u naemprimeru.
%odrazumevano! brojanje )e poeti od jedinice A( i uve)ava)e se za jedan prilikom svakogunosa. Grojanje mo$e poeti od bilo kog Acelog broja i mo$e imati neogranien inkrement.6vi parametri nazivaju se eedAbroj od koga poinje brojanje i -ncrementAbroj za koji )esvaka nova kolona biti pove)ana.
Ukoliko $elimo da podesimo drugaiju inicijalnu vrednost -U+6 *&C=5=&+ svojstva!mo$emo to posti)i otvaranjem ,ptionstaba7
7. ,dabir ,ptions taba
i postavljanjem vrednosti u polje -uto *ncrement7
-
7/23/2019 3. Primarni i Strani Kljuevi
5/13
Copyright Link group
7. Pode8aanje (uto -ncrement opcije
#umirajmo sada sve ono to smo uradili na kreiranju tabele product. &a slici '.B je prikazanizgled prozora za kreiranje tabeleproductsa unetim svim potrebnim podacima.
7.7 -zgled !olona tabele product
Ukratko! da sumiramo7
Product-&H identiikaciona kolona! primarni klju! ne prihvata &ULL vrednostii vrednosti se u ovu kolonu automatski upisuju i uve)avaju za jedanI
NameH kolona za smetanje imena proizvoda! ne prihvata &ULL vrednosti!maksimalna du$ina 01 karakteraI
Price! kolona za smetanje cene proizvoda! ne prihvata &ULL vrednosti!
prihvata brojeve sa maksimalno (3 ciara! i 0 cire razlomljenog dela.
&akon ovoga odaberite dugme -pply. %rikaza)e se prozor u kome mo$ete da pogledate upitkoji je generisan na osnovu ,aih podeavanja. Jo jednom pominjem! kreiranje tabela naovaj nain! kori)enjem 5y#;L Korkbencha! predstavlja samo laki nain da se do:e doupita koji je neophodno izvriti na 5y#;L serveru kako bi se dobila $eljena tabela. 5i )emou narednom modulu nauiti da samostalno piemo ovakve upite.
-
7/23/2019 3. Primarni i Strani Kljuevi
6/13
Copyright Link group
7.9 enerisana s!ripta za !reiranje tabele product
%otvrdite ponovo ovaj upit! pritiskom na dugme -pply! i upit )e biti izvren na serveru! asamim tim tabela kreirana.
&akon kreiranja tabeleproduct! potrebno je da kreiramo i ostale tabele! po == dijagramu.&aredna tabela koju )emo kreirati je tabela za smetanje inormacija o muterijamacustomer. Ukoliko se ne se)ate dobro ovog dijagrama! savet je da se podsetite u lekcijiProje!toanje baze podata!au prvom modulu.
"reiranje ove tabele ne)emo pro)i tako detaljno kao to smo to uradili prilikom kreiranjatabele product. %roces kreiranja ,am je ve) poznat tako da )emo odmah prikazati izgledprozora za kreiranje tabele sa unetim svim potrebnim podacima7
7.: -zgled prozora za !reiranje tabele customer
-
7/23/2019 3. Primarni i Strani Kljuevi
7/13
Copyright Link group
ezimira)emo ukratko tabelu u domenu kolona.
customer_id H identiikaciona kolona! primarni klju! ne prihvata &ULLvrednosti! vrednost se autoamtski dodeljuje! uve)ana za jedanA-U+6>*&C=5=&+.
4irst_nameH polje za smetanje imena muterije! ne prihvata &ULL vrednosti!
maksimalna du$ina unosa 01 karaktera. last_name H polje za smetanje prezimena muterije! ne prihvata &ULL
vrednosti! maksimalna du$ina unosa 01 karaktera. email! polje za uvanje emajl adrese! prihvata &ULL vrednost! tj. nije
obavezan unos vrednosti! maksimalna du$ina 01 karaktera. date! kolona za smetanje datuma ro:enja muterije! ne prihvata &ULL
vrednosti.
&akon to smo kreirali ove dve tabele! mo$emo da nastavimo dalje sa konvertovanjemkonceptualnog u logiki dizajn.
Strani klju (Foreign Key)
%odsetimo se kako izgleda = dijagram baze koji kreiramo.
7.1; ER dijagram baze prodaje
5i smo napravili tabele po entitetima Customer i %roduct. 6staje da razmotrimo ta raditi sarelacijom koja postoji izme:u ovih entiteta. # obzirom da relacija poseduje sopstveneatribute koji je bli$e opisuju! a i da postoji potreba za uvanjem inormacija o prodajama!name)e se logian zakljuak da )e u ovom sluaju relacija postati nova tabela. *nae!relacija vie na vie! gotovo uvek kreira novu tabelu.
azmislimo sada ta )e od kolona imati ova nova tabela koju )emo kreirati. ,idimo darelacija poseduje atribute Number Aza bele$enje broja kupovine i +imestamp Aza uvanje
-
7/23/2019 3. Primarni i Strani Kljuevi
8/13
Copyright Link group
vremena kupovine. Logino je da je jo potrebno bele$iti i inormacije o tome ko jenapravio kupovinu i ta je tom prilikom kupio. 6vo znai da je potrebno bele$iti kojimuterija Acustomer je kupio koji proizvod Aproduct. 6vo znai da )emo pored dve kolonekoje )emo dobiti mapiranjem atributa! morati da napravimo jo dve kolone za identiikacijumuterije i proizvoda.
"oji podatak je najbolje koristiti u identiikaciji muterije i proizvodaM "ao najbolji kandidatiza ovu svrhu se name)u upravo identiikacione kolone tabela 5ustomeri Product.
"olone koje predstavljaju reerence na neke druge tabele nazivaju sestrani kljuevi.
&apravimo kolone o kojima smo priali.
7.11 Kreiranje !olona tabele bu
"olone customer_id i product_id zapravo predstavljaju vrednosti ovih kolona konkretnogmuterije i proizvoda. 6vo su! zapravo! kolone kojima se ostvaruje relacija me:u tabelama!tj. ovo su strani kljuevi. *pak! mi nigde nismo konkretno deinisali ovu povezanost o kojojpriamo. "olone customer_idiproduct_idsu obine kolone kao i svake druge. 6vo znai dani na koji nain nije specijalno naglaeno da su ove kolone strani kljuevi. 5y#;L )e ovekolone tretirati kao bilo koje druge kolone.
?eneriimo sada upit za kreiranje ove tabele pritiskom na taster -pply! a zatim pokrenimoovaj upit na serveru ponovnim pritiskom tastera -pply. &a ovaj nain )emo kreirati tabelu.
&akon to smo kreirali tabelu! iskljuivo demonstrativno )emo u nju uneti jedan. Upite za
unos podataka jo nismo obradili! ali ovoga puta )emo ovo uraditi samo kako bismodemonstrirali jednu pojavu.
Upit za unos podatka u tabelu buje slede)i7
INSERT INTO `my_first_db`.`buy` (`number`, `time`, `customer_id`,
`product_id`) VALUES ('234/23', now(), 2, 5);
-
7/23/2019 3. Primarni i Strani Kljuevi
9/13
Copyright Link group
4ta smo mi postigli ovim upitomM
Uneli smo u tabelu bujedan podatak! tj. jedan zapis ili red. 2a broj kupovine smo postavili23#
-
7/23/2019 3. Primarni i Strani Kljuevi
10/13
Copyright Link group
7.12 ,pcija (lter table za izmenu tabele
&a ovaj nain dobijamo prozor identian onom u kome smo kreirali tabelu.Da bismo dodali strani klju! dovoljno je iz prozora za kreiranje tabele odabrati tab 'oreignKes7
7.13 ,dabir taba 'oreign Kes
U prozoru koji se otvorio dodajte naziv stranog kljua u kolonu 'oreign Ke Name i odaberite
reerenciranu tabelu Atabelu sa kojom postoji relacija. +o )e u naem sluaju biti tabelacustomer.
7.1# &odaanje stranog !lju"a
&akon ovoga u desnom delu prozora mo)i )ete da odabere konkretne kolone iz tabele kojukreirate i reerencirane tabele. U naem sluaju obe kolone imaju identian nazivcustomer_idi to je dobra praksa.
7.1? &odaanje stranog !lju"a$2%
-
7/23/2019 3. Primarni i Strani Kljuevi
11/13
Copyright Link group
&a kraju! mo$emo Aa ne moramo postaviti i dodatne parametre oreign key ograniavau.+o su7 ,n &eletei ,n )pdateosobine.
7.1 &odatni parametri stranog !lju"a
5o$emo da primetimo da su ove osobine inicijalno postavljene na vrednost &6 -C+*6&.
%rvo je potrebno da shvatimo kontekst u kome su ovi parametri bitni. 2amislite sadasituaciju da u naoj bazi koju smo kreirali postoje stotine proizvoda i isto toliko muterija ida u bazi imamo registrovan veliki broj proizvoda od strane razliitih muterija koji supazarili razliite proizvode. 4ta bi se dogodilo! ukoliko bismo obrisali neku muteriju iz tabelecustomer. #ve one prodaje! tj. u svim onim zapisima u tabeli prodaja u kojima se pojavljujeova muterija osta)e podaci koji pokazuju na nepostoje)u muteriju. Upravo se oviparametri tiu pitanja! ta )e se dogoditi sa povezanim podacima u ovakvim situacijama. Dabismo pojednostavili stvari! posmatra)emo tabele i zapise na slede)i nain. 4ta )e se desitisa zapisima u tabeli prodaja u kojima je uestvovala odre:ena muterija koju $elimo daizbriemo ili pak da joj izmenimo id kolonu.
%ogledajmo znaenje svih dostupnih opcija za ove parametre u opisanoj situaciji7
R!S"R#"
U opisanoj situaciji brisanje muterije ili izmena identiikacione kolone ne)e biti dozvoljena.
$% &"#%$
U 5y#;Lu ova opcija je identina prethodno opisanoj opciji =#+*C+! tj. ima isti eekat.*nae ovo je podrazumevana opcija ukoliko se nita ne podeava. U nekim verzijama #;Ljezika! tj. u nekim drugim relacionim sistemima baza podataka! ove dve opcije imajurazliito znaenje. U sistemima gde postoji odlo$ena provera kljueva! ove dve opcije imajurazliito znaenje.
&S&'!
2a parametar 6n Update ova opcija predstavlja veoma dobro reenje. Ukoliko je odabrana!editovanjem primarnog kljua muterije! do)i )e do identine promene u svim povezanimtabelama! tj. svuda tamo gde se pojavljuje ovaj *D muterije koji smo izmenili.
Ukoliko se ova opcija koristiti za parametar 6n Delete mo$e biti veoma opasna! jer mo$eizazvati ne$eljen gubitak podataka. U naem sluaju! ukoliko bismo obrisali muteriju!automatski bi se obrisale i sve njegove kupovine. 6vo ba i nije ponaanje koje bismo $eleli!pa se u ovakvim situacijama ova opcija ne preporuuje.
-
7/23/2019 3. Primarni i Strani Kljuevi
12/13
Copyright Link group
S!" $
Golja varijanta od prethodno opisane u sluajevima brisanja je svakako opcija #=+ &ULL."ada je ova opcija ukljuena! ukoliko bismo obrisali muteriju! u svim kupovinama ovemuterije za kolonu customer_idbila bi postavljena vrednost null.
*sta situacija bi se i dogodila prilikom promene ida muterija! to i nema neku preteranuunkciju.
,ratimo se sada kreiranju stranih kljueva.
&a isti nain kreira)emo i drugi strani klju! s obzirom da je naa tabela buu relaciji sa dvetabele! i sa tabelomproducti sa tabelom customer.
7.19 &odaanje drugog stranog !lju"a
7.19 &odaanje drugog stranog !lju"a$2%
&akon dodavanja stranih kljueva! kreirali smo osnovni logiki dizajn! tj. izvrili smomapiranje konceptualnog dizajna u konkretne tabele sa relacijama. U slede)em moduluupozna)emo se sa osnovnom #;L sintaksom! s obzirom da smo do sada prete$no koristiliKorkbench integrisano okru$enje za generisanje upita.
Pitanje
"ako se naziva primarni klju tabele kada se nalazi reerenciran u nekoj drugoj tabeliM
strani klju primarni klju
auto inkrement
Primarni !lju" jedne tabele u ne!oj drugoj tabeli nazia se strani !lju" i on predstaljarelaciju izme@u de tabeleA !oja moBe biti i starna $4izi"!a%A postaljanjem ograni"aa"are4erencijalnog integriteta.
-
7/23/2019 3. Primarni i Strani Kljuevi
13/13
Copyright Link group
Rezime
%rimarni klju je osnovni ograniavaju)i aktor u jednoj tabeliI to je svojstvokolone! koje ne omogu)ava da se vrednosti u njoj ponavljaju.
%onekad! tabela mo$e imati i nekoliko kolona! koje zajedno ine primarni kljute tabele! ali je ipak! naje)e! to samo jedna kolona.
"olone koje predstavljaju reerence na neke druge tabele nazivaju sestranikljuevi. #trani klju je simbol relacione baze podataka. 6graniava stranog kljua A@oreign "ey Constraint odr$ava iziku relaciju
izme:u dve tabeleI jednostavnije reeno H ne dozvoljava da u jednu tabelubude unesena vrednost! ukoliko takva vrednost ne postoji u drugoj tabeli napovezanoj koloni.