Uygulamalarımızda veri bütünlüğümüzü sağlamak, bozuk tutarsız verilerin girişini ya da mevcut bilgilerin üzerinde değişiklik yaparken bozulmasını engellemek isteriz.Bunu sağlamak için önceden bir takım kurallar tanımlamak durumundayız.Bunu aşağıdaki gibi bir örnekle kısaca açıklayalım :

“emp” tablosunda çalışan bilgileri , “dept” tablosunda da çalışılan bölüm bilgileri tutulmaktadır.EMP tablosunda empno alanının tek olması, ename alanının boş olmaması, sal alanını 10.000 den küçük olması, deptno alanının dept tablosunda muhakkak bir karşılığının olması, dept tablosunda da dname alanının dolu olması şartlarını sağlamak isteyebiliriz.Tüm bunlar verimizin bütünlüğünü ve tutarlılığını garanti altına almak için konulan kurallardır.
Veri tutarlılığını, bütünlüğünü sağlamak için kullanılan kuralları aşağıdaki gibi özetlemek mümkün :
NULL Kuralı(NULL Rule) : Bir kolon üzerinde update ya da insert işlemi olduğunda bu kolonun NULL olabilir ya da NULL olamaz kontrolüdür.
Tek değerli Kolon Kuralı (Unique Column Rule) : Bu kural ile bir kolonun (ya da kolon grubunun) tek bir deger alması sağlanabilir. Anahtar Değer Kuralı(Primary Key Rule) : Bir tabloda anahtar değer olarak tek değer içermesi istenen kolon ya da kolonlar grubudur.
Referential Integrity Rules : Kısaca , bir kolonun karşılığının diğer bir tabloda bulunması zorunluluğudur.Kendi içinde çeşitleri vardır.Referans olan verinin silinmesi ya da değişirilmesini engelleyebilir, update edildiğinde ya da silindiğinde NULL a set edilmesini sağlayabilir , bu verinin silinmesi ya da değiştirlmesi durumunda cascade olarak bağlı tüm verinin silinmesini ya da değiştirilmesini sağlayabilirsiniz.Özellikle “Referential Integrity” en cok kullanılan kurallardandır.
Oracle ın desteklediği kurallar aşağıdaki şekilde özetlenebilir :
NOT NULL kısıtı (constraint)
UNIQUE kısıtı (constraint)
PRIMARY KEY kısıtı (constraint)
CHECK kısıtı (constraint) à Karmaşık kurallar içeren kısıtlarda kullanılır.
FOREIGN KEY kısıtı (constraint).Bu kısıt aynı zamanda Referential Integrity kapsamındadır.Bunun içersinde update,delete no action – delete cascade ve delete set null özellikleri bulunur.
Şimdi bunları daha detaylı olarak inceleyelim :
NOT NULL integrity constraint : Bu kısıt ile bir kolonun muhakkak bir deger almasını sağlayabiliriniz.Bunu tablo olustururken ya da tablo oluşturduktan sonra ALTER TABLE ile sağlayabilirsiniz :
Create table t (id number,
str varchar2 not null);
Alter table t modify str null;
UNIQUE key integrity constraint : Bu kısıt ile bir ya da daha fazla kolonu içine alacak şekilde aynı tabloda bu kolon ya da kolonların birlikte aynı değeri alan 2. bir kayıt olması engellenmiş olur.
Ektradan NOT NULL kısıtı olmadıgı sürece uniqueu key kısıtında null değer girilebilir. Bunu tablo olustururken ya da tablo oluşturduktan sonra ALTER TABLE ile sağlayabilirsiniz ya da kaldırabilirsiniz.(Birden fazla kolon üzerinde oluşturulursa “composite unique key” denir.)
Create table t (id number,
str varchar2
unique str);
Alter table t drop constraint sys_c001463;
Alter table t add constraint t_str_uni;
Bu kısıt oluşturuldugunda oracle unique index oluşturur.
Primary key integrity constraint : Unique key kısıtına benzese de farklıdır.Primary key null deger alamaz ve tablo da en fazla bir tane primary key kısıtı olabilir.Ortak ozelliği tanımlı kolon ya da kolonlar için aynı degerde satırlar olamaz.
Create table t(id number primary key,Str varchar2)
Primary key oluşturma durumunda T tablosunda id kolonu için hem unique index oluşturulur hem de id kolonu için not null kısıtı oluşturulur.
Referential Integrity Constraints : Öncelikle aşağıda geçen terimleri iyi anlamak gerekiyor.
Foreign key : Kolon ya da kolonlar grubu olabilir.Referans verilen anahtarı(refrenced key) gösterir.
Referenced key : Foreign key tarafında referans verilen aynı ya da farklı tablodaki primary key ya da unique keylerdir.
(Depended = child ) table : foreign key barındıran tablodur.
(Referenced = parent) table : foreign key in gösterdiği alanın bulundugu tablodur.
Foregin key parent tabloda bir parent key ile eşleşmelidir.Ama not null kısıtı yok ise NULL değer içerebilir.Parent tablo ile child tablonun aynı da olabilir.(Self Integrity Constraints) Referenced parent key değeri üzerinde bir değişiklik ya da silinme durumu olduğunda otomatik olarak bazı işlemlerin yapılması sağlanabilir.Referenced parent key silinme teşebbüsünde varsayılan olarak buna izin verilmez.Ama delete cascade opsiyonu ile parent tabloda bulunan değer silinince child tabloda bulunan bu değerdeki tüm kayıların silinmesi sağlanabilir ya da NULL değer verilebilir.
Parent key hiç bir zaman update ya da delete görmüyorsa index konulmaz, diğer durumlarda foreign key üzerinde index oluşturmalıdır.Index olmadıgı durumda parent tablo uzerinde yapılan bir update işleminde tüm child tabloya lock konulması soz konusu olacaktır.Bu da child tablo üzerinde yapılacak DML işlemlerinin bekletilmesi anlamına gelecektir.
Check integrity constraints : Kolon ya da kolonlar üzerinde belli bir durumu sağlayıp sağlamaması durumuna göre konulan kısıtlardır.Bazı koşulları sağlaması gerekir.Şöyleki check kısıt view lar üzerinde tanımlanamaz, boolean bir değer üretmelidir, subquery ve sequence içeremez, sysdate gibi SQL fonksiyonları kullanılamaz, level – rownum gibi pseudocolumn lar içeremez.Örnekler :
CREATE TABLE suppliers (
supplier_id numeric(4),
supplier_name varchar2(50),
CONSTRAINT check_supplier_id CHECK (supplier_id BETWEEN 100 and 9999)
);
CREATE TABLE dept(
deptno NUMBER(2) CONSTRAINT pk_dept PRIMARY KEY,
CONSTRAINT ck_deptno CHECK (deptno BETWEEN 10 and 99),
dname VARCHAR2(9),
CONSTRAINT ck_dname CHECK (dname=UPPER(dname)),
loc VARCHAR2(10) CONSTRAINT ck_loc CHECK (loc IN(’DALLAS’,’BOSTON’,’CHICAGO’))
)
CREATE TABLE emp (
empno NUMBER(4) CONSTRAINT pk_emp PRIMARY KEY,
ename VARCHAR2(10),
job VARCHAR2(9),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2),
CONSTRAINT fk_deptno FOREIGN KEY (deptno) REFERENCES dept(deptno),
CONSTRAINT ck_total CHECK (sal + comm <=5000)
)
NOT :
1) Tüm bu kısıtlar Oralce SQL i çalıştırdıktan sonra kontrol edilir.
2) Kolonların varsayılan değerleri bir insert gibi işlem görür ve tüm kısıtlara tabidirler.
Hakkı Oktay
http://hakkioktay.wordpress.com