Kısıtlar(constarints) veritabanında ki veri bütünlüğünü sağlamak amacıyla oluşturulmuş kurallar olarak tanımlanabilir.Yani kısıtlar veritabanına hatalı giriş yapılmasını engeller.Örnegin bir tablomuzda cinsiyet sütunu olduğunu düşünelim ve bu sütuna veri olarak sadece E veya K girimesi gerekiyor bu gibi bir durumu kısıtlayıcılar ile sağlayabiliriz.Oracle’da var olan kısıtlayıcılar.
- NOT NULL : NULL değerlerin girilmesini engeller.
- CHECK : Belirtilen şartın sağlanıp saglanmadıgını kontrol eder.
- UNIQUE : İlgili sütunda veri tekrarını engeller.
- PRIMARY KEY : Bir tabloda ki benzersiz alanı belirtir.Yani hem NOT NULL olacak hem de UNIQUE olacak.
- FOREIGN KEY : Tablolar arasında ortak sütunları kullanarak ilişki olmasını sağlar.
Kısıtlar CREATE TABLE veya ALTER TABLE ile oluşturulur.
Kısıtımız sadece bir sütun ile ilgiliyse sütun seviyesin de kısıt oluşturulur.Eger kısıtımız birden fazla sütun içeriyorsa tablo seviyesin de kısıt oluşturulabilir.Kısıt oluşturmak için gerekli söz dizimi ;
Sütun Seviyesi ;
<sütun_adı> [ CONSTRAINT < kısıt_adı > ] kısıt_tipi,
Tablo Seviyesi ;
……. <sütunN> ,
[ CONSTRAINT < kısıt_adı > ] kısıt_tipi ( <sütun1> , <sütun2> , …..)
Kısıt oluştururken bir isim verilmesi gerekiyor.Eger isim verilmez ise Oracle otomatik olarak SYS_Cn formatın da bir isim verecktir.(SYS_C001256, SYS_C003546 vs.)
NOT : Oracleda varolan kısıtlar hakkında bilgi almak istersek DBA_CONSTRAINTS,USER_CONSTRAINTS,ALL_CONSTRAINTS,USER_CONS_COLUMNS,ALL_CONS_COLUMNS views(görüntülerini) kullanabiliriz.
NOT NULL
Sütun seviyesin de tanımlanan bir kısıttır.Tablo seviyesin de tanımlanamaz.NOT NULL kısıtı sütuna NULL değer girişine izin vermez.
- Aşagıda ki SQL cümlesiyle deneme_not_null isimli tablo oluştururuz,oluştururken de email adlı sütuna test_not_null isimli NOT NULL kısıtını ekleriz,date_of_birth sütununa da otomatik bir isimle NOT NULL kısıtını ekler.
CREATE TABLE deneme_not_null( id NUMBER, name VARCHAR2(20), email VARCHAR2(20) CONSTRAINT test_not_null NOT NULL, date_of_birth DATE NOT NULL );
Bir tablo da yer alan sütunlara NOT NULL kısıtı eklemek ya da çıkarmak için ALTER TABLE MODIFY cümlesi kullanılır.
- Aşagıda ki SQL cümlesiyle deneme_not_null tablosunda ki name sütununa NOT NULL kısıtını ekleriz.
ALTER TABLE deneme_not_null MODIFY name NOT NULL;
- Aşagıda ki SQL cümlesiyle deneme_not_null tablosunda olan name sütununda ki NOT NULL kısıtını kaldırır.
ALTER TABLE deneme_not_null MODIFY name NULL;
CHECK
CHECK kısıtını sütun ya da tablo seviyesin de tanımlamak mümkündür.CHECK kısıtı bir koşul cümlesi içerir,ilgili sütuna ya da tabloya veri girişi yapılırken sadece bu koşula uyan kayıtların sütuna ya da tabloya eklenmesine izin verir.Söz dizimi ;
[ CONSTRAINT < kısıt_adı > ] CHECK ( <koşul> )
CHECK kısıtı oluştururken dikkat edilmesi gerekenler ;
- CHECK cümlesi sonucu mutalaka doğru ya da yanlış şeklinde bool bir değer olmalıdır.
- CHECK cümlesi aynı satırda yer alan diğer sütunlara referans verebilir.
- CHECK koşulu oluştururken SYSDATE,USER,USERNV,UID,ROWNUM,CURRVAL,NEXTVAL,LEVEL ifadeleri kullanılamaz.
- Bir sütuna ait birden fazla CHECK kısıtı olabilir.
- Aşagıda ki SQL cümlesiyle deneme_check isimli tablo oluştururuz,oluştururken de salary adlı sütuna test_check isimli CHECK kısıtını ekleriz,CHECK kısıtı ile de salary’e 1000’den düşük deger girişini engelleriz.
CREATE TABLE deneme_check( id NUMBER, name VARCHAR2(20), email VARCHAR2(20), salary NUMBER CONSTRAINT test_check CHECK ( salary > 1000 ) );
- Aşagıda ki SQL cümlesiyle deneme_check tablosunda ki email sütununa test_check2 adlı CHECK kısıtı ekleriz.CHECK kısıtı ile de email sütununa @ simgesinin girilmesini mecbur kılıyor.
ALTER TABLE deneme_check ADD CONSTRAINT test_check2 CHECK (email like '%@%');
- Aşagıda ki SQL cümlesiyle deneme_check tablosuna age sütunu ekleriz daha sonrada age sütununa test_check3 adlı CHECK kısıtı ekleriz.CHECK kısıtı ile de age sütununa 18’den düşük deger girilmesini engelleriz.
ALTER TABLE deneme_check ADD age NUMBER CONSTRAINT test_check3 CHECK (age > 18);
- Aşagıda ki SQL cümlesiyle deneme_check tablosunda ki test_check3 adlı CHECK kısıtını sileriz.
ALTER TABLE deneme_check DROP CONSTRAINT test_check3 ;
- Aşagıda ki SQL cümlesiyle deneme_check tablosuna test_check4 adlı CHECK kısıtı ekliyoruz.
ALTER TABLE deneme_check ADD CONSTRAINT test_check4 CHECK (id IS NOT NULL AND email IS NOT NULL OR name IS NULL AND salary IS NULL);
UNIQUE
UNIQUE kısıtı tabloda ki bir veya daha fazla sütun ile oluşturulur ve kısıtı oluşturan sütun ya da sütun grubuna aynı verilerin girilmesini engeller.UNIQUE kısıtı NULL değer girişine izin verir.
UNIQUE kısıtı tek bir sütun ile oluşturulduğu zaman ilgili sütuna aynı veri sadece bir kez girilebilir.Söz dizimi ;
[ CONSTRAINT < kısıt_adı > ] UNIQUE
UNIQUE kısıtı tek bir sütun ile oluşturulabildiği gibi birden fazla sütun içerecek şekilde kompozit bir yapıda da oluşturulabilir.Bu şekilde en fazla 32 sütun kullanılabilir.Bu durum da ilgili sütun grubu için aynı veri grubu sadece bir kez girilebilir.Bu şekilde bir kısıtı tablo seviyesinde tanımlanmalıdır.
[ CONSTRAINT < kısıt_adı > ] UNIQUE ( <sütun1> , <sütun2> , …..)
- Aşagıda ki SQL cümlesiyle deneme_unique isimli tablo oluştururuz,oluştururken de email adlı sütuna test_unique isimli UNIQUE kısıtını ekleriz,date_of_birth sütununa da otomatik olarak isim atayarak UNIQUE kısıtı ekleriz.
CREATE TABLE deneme_unique( id NUMBER, name VARCHAR2(20), email VARCHAR2(20) CONSTRAINT test_unique UNIQUE, date_of_birth DATE UNIQUE );
- Aşagıda ki SQL cümlesiyle deneme_unique tablosunda ki id sütununa test_unique2 isimli UNIQUE kısıtını ekleriz.
ALTER TABLE deneme_unique ADD CONSTRAINT test_unique2 UNIQUE (id);
- Aşagıda ki SQL cümlesiyle deneme_unique tablosuna phone_number adlı sütun ekler ve test_unique3 adlı UNIQUE kısıt ekleriz.
ALTER TABLE deneme_unique ADD phone_number NUMBER CONSTRAINT test_unique3 UNIQUE ;
- Aşagıda ki SQL cümlesiyle deneme_unique tablosunda ki id ve email sütununa test_unique6 isimli UNIQUE kısıtını ekleriz.
ALTER TABLE deneme_unique ADD CONSTRAINT test_unique6 UNIQUE (id,email);
- Aşagıda ki SQL cümlesiyle deneme_unique tablosunda ki test_unique3 adlı UNIQUE kısıtını sileriz.
ALTER TABLE deneme_unique DROP CONSTRAINT test_unique3 ;
NOT : Oracle UNIQUE kısıtını oluşturan sütunlar için unique index oluşturur.Eger unique ya da unique olmayan aynı sütunlardan ve aynı sütun sırasında bir index önceden oluşturulmuş ise yeni index oluşturulmaz var olan index kullanılır.
PRIMARY KEY
PRIMARK KEY kısıtı UNIQUE kısıtının ve NOT NULL kısıtının birleşimidir.Yani hem NULL değer girişine hem de aynı(tekrar) verinin girişine engeller.
NOT : Bir tabloda sadece bir adet PRIMARY KEY kısıtı olabilir ama bir PRIMARY KEY kısıtının için de birden fazla sütun olabilir.
- Aşagıda ki SQL sorgusuyla deneme_primary_key adlı tablo oluşturur ve id sütununa test_primary_key adlı Primary Key kısıtı ekleriz.
CREATE TABLE deneme_primary_key( id NUMBER CONSTRAINT test_primary_key PRIMARY KEY, name VARCHAR2(20), email VARCHAR2(20) );
- Aşagıda ki SQL sorgusuyla deneme_primary_key adlı tablo oluşturur ve id sütununa otomatik bir isim vererek Primary Key kısıtı ekleriz.
CREATE TABLE deneme_primary_key( id NUMBER PRIMARY KEY, name VARCHAR2(20), email VARCHAR2(20) );
- Aşagıda ki SQL sorgusuyla deneme_primary_key adlı tablo oluşturur ve id ve email sütununa test_primary_key adlı Primary Key kısıtı ekleriz.
CREATE TABLE deneme_primary_key( id NUMBER, name VARCHAR2(20), email VARCHAR2(20), CONSTRAINT test_primary_key PRIMARY KEY (id,email) );
- Aşagıda ki SQL sorgusuyla deneme_primary_key adlı tabloya id sütununa test_primary_key adlı Primary Key kısıtı ekleriz.
ALTER TABLE deneme_primary_key ADD CONSTRAINT test_primary_key PRIMARY KEY(id) ;
- Aşagıda ki SQL cümlesiyle deneme_primary_key tablosunda ki test_primary_key adlı Primary Key kısıtını sileriz.
ALTER TABLE deneme_primary_key DROP CONSTRAINT test_primary_key ;
- Aşagıda ki SQL cümlesiyle deneme_primary_key tablosunda ki Primary Key kısıtını sileriz.
ALTER TABLE deneme_primary_key DROP PRIMARY KEY;
- Aşagıda ki SQL cümlesiyle deneme_primary_key tablosunda ki Primary Key kısıtını sileriz CASCADE kullandıgımız için ilişki olsa dahi siler.
ALTER TABLE deneme_primary_key DROP PRIMARY KEY CASCADE ;
NOT : Oracle PRIMARY KEY kısıtını oluşturan sütun için index oluşturur
NOT : UNIQUE ve PRIMARY KEY kısıtları nedeniyle oluşturulan indexler ,normal indexler gibi yönetilebilir ama bu indexler DROP INDEX komutu ile düşürülemez(silinemez).
FOREIGN KEY
FOREIGN KEY kısıtı ilişkisel bütünlüğü sağlamamızı sağlar.Bu kısıtla bir tabloda ki PRIMARYKEY ya da UNIQUE sütunla diğer tabloda ki ya da aynı tabloda ki diğer bir sütun ile bir ilişki oluşturur.Bu sayede FOREIGN KEY kısıtı olan tabloya NULL harici bir kayıt eklenirken ilgili kaydın ana tabloda yer alması koşulu aranır.
- Aşagıda ki SQL cümlesiyle deneme_foreign_key_child adlı tablo oluşturur ve patientid adlı sütuna da Primary key kısıtı ekleriz.
CREATE TABLE deneme_foreign_key_child( patientid NUMBER PRIMARY KEY, patientname VARCHAR2(20), patientemail VARCHAR2(20) UNIQUE, doctorid NUMBER );
- Aşagıda ki SQL cümlesiyle deneme_foreign_key_parent adlı tablo oluştururuz.
CREATE TABLE deneme_foreign_key_parent( doctorid NUMBER PRIMARY KEY, doctorname VARCHAR2(20), doctoremail VARCHAR2(20) UNIQUE );
- Aşagıda ki SQL koduyla da deneme_foreign_key_child adlı foreign key sütun ekleriz.Referans olarak da deneme_foreign_key_parent tablosundan doctorid sütunu alırız.
ALTER TABLE deneme_foreign_key_child ADD CONSTRAINT test_foreign_key FOREIGN KEY (doctorid) REFERENCES deneme_foreign_key_parent(doctorid);
- Aşagıda ki SQL koduyla foreign key otomatik olarak isim alır ve foreign key kısıtı ekleriz.Referans olarak da deneme_foreign_key_parent tablosundan doctorid sütunu alırız.
ALTER TABLE deneme_foreign_key_child ADD FOREIGN KEY (doctorid) REFERENCES deneme_foreign_key_parent(doctorid);
- Aşagıda ki SQL cümlesiyle deneme_foreign_key_child tablosunda ki TEST_FOREIGN_KEY adlı foreign key kısıtını sileriz.
ALTER TABLE deneme_foreign_key_child DROP CONSTRAINT TEST_FOREIGN_KEY ;
NOT : FOREIGN key kısıtı oluştururken ON DELETE cümlesi kullanabiliriz,ON DELETE cümlesi ile ana(parent) tablodan bir kayıt silindiği zaman ne yapılacağını belirleriz.ON DELETE CASCADE kullanırsak ana tablo da bir kayıt silinirse çocuk(child) tablodaki bununla ilgili kayıtlar da otomatikman silinir.ON DELETE SET NULL kullanırsak ana tabloda bir kayıt silinirse çocuk tabloda ki bununla ilgili kayıtlara NULL değer atanır.Eger ON DELETE cümlesi kısıt oluşturulurken kullanılmaz iseOracle çocuk tabloda kayıt varken ana tablodan kayıt silinmesine izin vermez.
- Aşagıda ki SQL koduyla test_foreign_key adlı foreign key kısıtı ekleriz.Daha sonra ana tabloda bir kayıt silindigi zaman da çocuk tabloda ki ilişkili kayıtlar da silinir.
ALTER TABLE deneme_foreign_key_child ADD CONSTRAINT test_foreign_key FOREIGN KEY (doctorid) REFERENCES deneme_foreign_key_parent(doctorid) ON DELETE CASCADE;
- Aşagıda ki SQL koduyla test_foreign_key adlı foreign key kısıtı ekleriz.Daha sonra ana tabloda bir kayıt silindigi zaman da çocuk tabloda ki ilişkili kayıtlara NULL eklenilir.
ALTER TABLE deneme_foreign_key_child ADD CONSTRAINT test_foreign_key FOREIGN KEY (doctorid) REFERENCES deneme_foreign_key_parent(doctorid) ON DELETE SET NULL;
Kısıtların Geçerliligi
Bir kısıt oluşturulduğu zaman kısıt otomatik olarak etkin hale gelir.Bir kısıtı geçersiz yapmak için DISABLE,geçerli kılmak için ENABLE kelimeleri kullanılır.Etkin olmayan bir kısıt ilgili kısıt işlemini gerçekleştirmez.
Aşagıda ki SQL cümlesiyle deneme_check tablosunda ki test_check adlı kısıtı geçersiz kıldık.
ALTER TABLE deneme_check MODIFY CONSTRAINT test_check DISABLE ;
- Aşagıda ki SQL cümlesiyle deneme_check tablosunda ki test_check adlı kısıtını geçerli kıldık.
ALTER TABLE deneme_check MODIFY CONSTRAINT test_check ENABLE;
- Aşagıda ki SQL cümlesiyle deneme_check tablosunda id sütununa test_unique2 isimli UNIQUE ekler ve geçerşiz hale getiririz.
ALTER TABLE deneme_unique ADD CONSTRAINT test_unique2 UNIQUE (id) DISABLE;
ENABLE veya DISABLE sadece tabloya sonradan eklenecek olan kayıtları etkiler.Bununla birlikte VALIDATE ve NOVALIDATE kelimeleri var olan kayıtlar üzerinde çalışır.Bu nedenle bir kısıtın 4 durumundan bahsetmek mümkündür.
ENABLE_VALIDATE : Kısıtlar için varsayılan durumdur.Tabloda var olan kısıtların kısıta uyup uymadığını denetler.
ENABLE_NOVALIDATE : Bu durum kısıtı aktif hale getirmesine karşın var olan kayıtların kısıta uyup uymadığını denetlemez.
DISABLE_VALIDATE : Kısıt aktif olmayan hale getirilir.Tablo üzerinde DML işlemine izin vermez çünkü sonra ki değişikliklerin geçerliliğini denetlemez.
DISABLE_NOVALIDATE : Bir kısıt DISABLe yapıldığı zamanki varsayılan durumdur.Kısıt aktif olmayan durumdadır ve var olan ya da sonra ki kayıtların girişlerini denetlemez.
Aşagıda ki SQL cümlesiyle test_check adlı kısıtı aktif olmayan hale getirir ve tablo üzerinde DML işlemine izin vermez.
ALTER TABLE deneme_check MODIFY CONSTRAINT test_check DISABLE_ VALIDATE ;
Aşagıda ki SQL cümlesiyle test_check adlı kısıtı aktif hale getiririz ama var olan kayıtların kısıta uyup uymadığını denetlemez.
ALTER TABLE deneme_check MODIFY CONSTRAINT test_check ENABLE_ NOVALIDATE;
Aşagıda ki SQL cümlesiyle test_check adlı kısıtı geçersiz kılarız.
ALTER TABLE deneme_unique ADD CONSTRAINT test_unique2 UNIQUE (id) DISABLE_ NOVALIDATE;
NOT : Örneklerimde Oracleda ki DUAL table ’ ı ve HR user ’ ı kullanıyorum.
Yararlı olması Dilegiyle…
Yazar : Mustafa Bektaş Tepe
Java && Oracle