3. Primarni i Strani Ključevi

Embed Size (px)

Citation preview

  • 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.