Oracle Veritabanı Üzerinde Kısıtlayıcılar (Constraints)

Dökümanın Forum Konusu Linktedir : http://www.tahribat.com/Forum-Dokuman-Oracle-Veritabani-Uzerinde-Kisitlayicilar-Constraints-165237/ 

Oracle 11g sürümünde kullanılabilen bes adet kısıtlayıcı bulunur :

-Primary Key kısıtlayıcısı

-Foreign Key kısıtlayıcısı

-Unique kısıtlayıcısı

-Not Null kısıtlayıcısı

-Check kısıtlayıcısı

Bu türlerden herhangi birisini tabloya eklerken ona bir de isim vermemiz gerekir. Bunun icin sistematik bir sıra olusturmanız, sonradan veritabanını incelediginizde size karısıklık cıkarmaması icin iyi bir yazılım kuralı olacaktır.

Kısıtlayıcıları tek tek inceleyelim.

1-) Primary Key

Primary Key’ler iliskisel veritabanları icin vazgecilmez bir unsurdur.

Birazdan deginecegim Unique ve NOT_NULL kısıtlayıcıları birleserek Primary Key’i olusturur. Bu bir sütundaki verilerin özgün ve kesinlikle bir deger icermesini saglar. Tablodaki her satırın, veritabanı icinde özgünce kaydedilmesini, böylelikle mutlaka bir deger iceren bu verilere kolayca erisimimize yardımcı olur.

Resimdeki örnekle daha iyi anlayacaksınız.

 

UYE_NO sütununda “1” degerini tasıyan satır “HolyOne”a aittir, yani “1” degeri sadece ona ait olabilir. NICK sütununda baska bir “HolyOne” daha olabilir ancak onun UYE_NO degeri “1” olmayacaktır.

Bir de su tabloya göz atalım.

6. sıradaki underzero’nun UYE_NO degeri “6”dır ve e-mail adresi yasli_amca@tahribat.com’dur. altındaki cakma underzero’nun UYE_NO degeri ise “7”dir ve mail adresi de farklıdır, yani bu kisi database icinde farklı bir kisi olarak gözükür. Özetlemek gerekirse, UYE_NO degeri farklı olan her bir kisi, Oracle 11g veritabanı icin farklı bir kayıttır.

2-) Foreign Key

Tek cümleyle acıklayacak olursak, Foreign Key, bir tablodaki sütunu, baska bir tablodaki sütunla etkilesime almaya yarar. Kaynak sütunun oldugu tabloya “parent”, hedef sütunun oldugu tabloya “child” tablo denir.

Resim üzerinden örnek verelim.

Child (hedef) tablomuz bu olsun :

Simdi bu tablodaki DEPARTMAN_ID sütununa Foreign Key atayıp asagıdaki tablonun DEPARTMAN_NO sütununa bagladıgımızı düsünelim.

Parent (kaynak) tablomuz :

Child tablomuza yeni satır eklerken DEPARTMAN_ID verilerinden birinin, Parent tablosunda DEPARTMAN_NO sütunundaki verilerden birisiyle aynı olması gereklidir. Cünkü ilk tablodaki DEPARTMAN_ID sütunu, Foreign Key aracılıgıyla ikinci tablonun DEPARTMAN_NO sütununa baglanmıstır.

Burada bir kuralı göz önünde bulundurmak gerek, eger Parent tablosunda DEPARTMAN_NO sütunundaki degerlerden birisi (örnegin "20"), ilk tablodaki DEPARTMAN_ID sütununda kullanılıyorsa, Parent tabloda yer alan ve DEPARTMAN_NO sütununda bulunan o satırı silemeyiz. Bu resimlerdeki örnege göre ikinci tablodaki “20/Programcılık” ve “30/Kuru Fasulye” satırları silinemez. Cünkü Child tablosunda bu degerler DEPARTMAN_ID sütununda da kullanılmaktadır. Fakat DEPARTMAN_NO verisi “40” olan satırı silebiliriz, cünkü Child tabloda bu deger bulunmamaktadır.

Eger DML komutlarından birisini (INSERT, DELETE VE UPDATE) kullanırsak, Foreign Key bu tip bir hatada size hata mesajı verecektir.

Es gecilmemesi gereken bir baska konu da, Child-Parent tablolarında atama yaparken, kaynak ve hedef sütunun veri türü ve veri genisligi de aynı olmalıdır. Yani VARCHAR2 tipindeki bir sütuna NUMBER ataması yapılamayabilir.

3-) Unique Kısıtlayıcısı

Adı da üzerinde oldugu gibi, Unique kısıtlayıcısını bir sütuna eklememiz durumunda, o sütunun alabilecegi degerler sadece bir kere mahsus, özgün degerler olacaktır.

Bir tablonun UYE_NO sütununa Unique kısıtlayıcısı atadıgımızı farzedelim. "12"-"34"-"56" seklinde giden verilerde herhangi bir hata yoktur, cünkü her bir satırın UYE_NO degeri özgündür. Eger Unique atamıs olsaydık, tablo asla su sekilde olamazdı :

Burada “doguhan” ve “Treasure” isimli kullanıcılara ait UYE_NO degerleri 34 olarak gözükmektedir. Oysa UYE_NO sütununa Unique kısıtlayıcısı atadıgımız icin böyle bir tablo asla olamaz.

Aynı tablo üzerinden gidecek olursak, asagıdaki tabloda hata yoktur :

Cünkü “Treasure” isimli kullanıcının UYE_NO degeri yoktur, deger olmaması demek, “0” anlamına degil, NULL deger anlamına gekir. Unique kullanılmıs bile olsa, o sütun NULL deger alabilir.

4-) Not_Null Kısıtlayıcısı

Eger bir sütundaki alanlara mutlaka bir deger girilmesini istersek, NOT_NULL kısıtlayıcısını kullanırız.

Tabloyu inceleyelim.

UYE_NO sütununda NOT_NULL kısıtlayıcısı mevcutsa, böyle bir tablonun varlıgı da olasıdır, cünkü bos deger yoktur.

Aynı durum asagıdaki tablo icin de gecerlidir :

UYE_NO tablosunda özgünlük aranmaz, yani Unique kısıtlayıcısının olup olmaması, NOT_NULL kısıtlayıcısını baglamaz. Dolayısıyla 2 ve 3. satırdaki veriler, NOT_NULL kullanımını destekler.

Kabul edilemeyecek tek durum su sekildedir :

UYE_NO tablosuna NOT_NULL ataması yapıldıgı icin, “Treasure” verisinin UYE_NO bölümü kesinlikle bos olamaz, NULL deger alamaz. Yani böyle bir tablo, UYE_NO sütunu icin NOT_NULL kısıtlayıcısının yokluguna ispattır.

5-) Check Kısıtlayıcısı

Eger bir sütuna yazılacak verilerin kendi belirledigimiz sınırların icerisinde olmasını zorunlu kılmak isterseniz bu kısıtlayıcıyı kullanmanız gerekir.

Tablomuza bakalım.

DEPARTMAN_ID sütununa atanacak bir Check kısıtlayıcısıyla, o sütuna ait verilerin “100”den büyük olmamasını saglayabiliriz. Yani bu sütun icin Check ataması yaparsak, alttaki tablo var olmayacaktır.

Cünkü “Treasure” degerini tasıyan satırın UYE_NO degeri asla “100” degerini gecemez.

Kısıtlayıcıları, mantıgını anlamak adına elimden geldigince sade anlatmaya calıstım, umarım ihtiyacı olanın isini görür. Sütunlara kısıtlayıcı atama konusunu ayrı bir doküman olarak hazırlamak istiyorum. Eger talep olursa fonksiyonlar icin de bir doküman hazırlayabilirim.

Bu doküman Tahribat.Com adına Andrei tarafından yazılmıstır.

Tarih:
Hit: 673299
Yazar: Andrei



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.