Oracle Ders 5 – Constraints (Kisitlamalar) – Part 2

Merhaba Arkadaslar,
Bu yazimizda Oracle DB de Constraint konusuna devam edecegiz.
Bu bolumde Unique, Check ve Not Null kisitlamalari ile ilgili ornekler vermeye calisacagim.

Unique Kisitlamasi

Unique olarak tanimlanan alandaki kayitlarin essiz olmasini saglar, kulaga Primary key gibi geliyor, hatirlayacaginiz gibi primary key tek bir alan olurken , unique kisitlamasi birden fazla column icin verilebilir.

Primary key , null deger alamazken Unique alanlar null degerini alabilirler.

Ornegimizi uygulayabimek icin su ornek tabloyu olusturalim ve uzerinde calisalim.

create table kisitlamalar ( 
alan1 varchar2(20) unique,
alan2 varchar2(20) unique,
alan3 varchar2(20),
alan4 number,
alan5 number
);

Gordugunuz gibi 5 tane alani olan bir tablo olusturdum, 3 tanesi varchar2 olurken 2 tane alanimiz number ve primary key den farkli olarak 2 tane alanimiz unique olarak tanimlandi. Gordugunuz gibi tabloyu olustururken bu sekilde unique alanlar olusturabiliriz.

Tablomuza ilk verimizi ekleyelim.

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1','deger2','deger3',10,20);

Kayit basariyla eklendi, peki ayni sorguyu tekrar calistirmak istersek ? Hata ile karsilasiriz cunku, unique olan alanlara ayni degere sahip kaydi eklemeye calisiyoruz.

oracle5_1

ALTER TABLE tablename
ADD [CONSTRAINT constraintname] UNIQUE (columnname);

genel formu ile tablomuzu alter islemine sokup, diledigimiz alani unique yapabiliriz.

alter table kisitlamalar add constraints kisitlamalar_alan3_uk unique(alan3);

alter isleminden sonra su sorguyu calistiralim,

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1-2','deger2-2','deger3',10,20);

Gordugunuz gibi daha oncesinde unique olan alan1 ve alan2 nin degerlerini degistirdik ,(deger1-2 ve deger2-2 yaptik) ama unique yaptigimiz alan3’un degerini ayni biraktik (deger3), tablomuzdaki kayitta alan3 icin deger3 kaydi oldugu icin hata ile karsilastik. Dolayisiyla unique alan icin ayni degerli kaydi eklememize oracle izin vermedi.

Check Kisitlamasi

Check kisitlamasi , ornegin elimizde maaslara dair bir tablo var ve maas alani 1000TL den kucuk olmamasi gerekmektedir. Bunun gibi spesifik bir durum belirtmek icin check kisitlamasi kullanilir.

ALTER TABLE tablename
ADD [CONSTRAINT constraintname] CHECK (condition);

tablomuzdaki alan4 icin 15ten buyuk olma durumunu yazalim ve calistiralim.

alter table kisitlamalar add constraint kisitlamalar_alan4_ck check(alan4>15);

oracle5_2

Gordugunuz gibi hata ile karsilastik, peki neden ? Tablomuzdaki kaydimizda alan4 icin ilk kayit 10du biz alan4>15 sartini eklemek istedik. 10>15 olmadigi icin bu sartimizi ekleyemedik. Tablomuzda veri varsa ekleyecegimiz check durumu tablomuzdaki veri saglamalidir.

Simdi tekrar su sorgumuzu calistiralim;

alter table kisitlamalar add constraint kisitlamalar_alan4_ck check(alan4>5);

Bu sefer basariyla islem gerceklesti,

Simdi check kisitimizi denemek icin su kaydi eklemeye calisalim,  dikkat ederseniz ornegimizdeki degerler unique kisitlamasina takilmamaktadir.

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1-2','deger2-2','deger3-2',1,20);

Ekleme basarisiz oldu…Peki neden ?

oracle5_2

alan4 icin 1 degerini verdik, ama bizim check condition ifademiz alan4> 5 idi bu nedenle sarti saglamadigi icin kayit eklenemedi.

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1-2','deger2-2','deger3-2',100,20);

yapip tekrar calistirali ve kaydimiz basariyla eklendi. (100>5 )

check icin su sekilde condition ifadeleri yazilabilir,

alan4<10
alan4>10
alan4 between10 and 20
alan4 in ( 10,20,30)

gordugunuz gibi >,< between ve in gibi condition ifadelerinden yararlanilabilir.

Not Null kisitlamasi

Not Null aslinda ozel bir check constraint ifadesidir. Not null olarak tanimlanan alana (column) mutlaka bir deger eklememiz gerektigini belirtir.

not null kisitlamasini yazmadan once su kayidi da tablomuza ekleyelim,

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1-3','deger2-3','deger3-4',null,null);

Gordugunuz gibi alan4 icin null deger verdik, unique alanlar null deger alabiliyordu.
alan5 icin de null deger verdik.

oracle5_4

ALTER TABLE tablename
MODIFY (columnname [CONSTRAINT constraintname]
NOT NULL);

veya

ALTER TABLE tablename
MODIFY (columnname not null);
alter table kisitlamalar modify (alan5 constraint kisitlamalar_alan5_nn not null);


oracle5_5

hata ile karsilastik, cunku not null yapmak istedigimiz alan tablomuzda null olarak kayit icermekte. Tablomuzdaki bu kaydi silelim,
su sorguyu calistiralim ve kaydimizi basariyla silelim..

delete kisitlamalar where alan5 is null;

Simdi tekrar 

alter table kisitlamalar modify (alan5 constraint kisitlamalar_alan5_nn not null);

sorgumuzu calistirabiliriz bu sefer islem basariyla gerceklesti. Denemek icin su sorguyu calistiralim.

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1-4','deger2-4','deger3-4',50,null);


oracle5_6

alan5 icin icin null degerini verdigimiz icin hata ile karsilastik,

Su sorgumuzu calistirdigimizda kayit basariyla gerceklesecektir.

insert into kisitlamalar (alan1,alan2,alan3,alan4,alan5) values ('deger1-4','deger2-4','deger3-4',50,100);

Kisitlamalar konusuna devam edecegiz.

Herkese Bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *