SQL Server'da Kısıtlamalar (Constraints)

Eyl 06, 2013

Kısıtlamaların Kullanımı:

Kısıtlamalar, nesnelerdeki alanlara girilen bilgiyi kontrol ederek bilginin güvenilirliğini artırırlar ve veri girişini daha kolay hale getirirler. 

Kısıtlamanın uygulandığı yer Kısıtlama Tipi Açıklama
Sütun DEFAULT Alana bir değer girilmediğinde otomatik olarak değer atar.
CHECK Bir alana girilen değerlerin o alan için uygun olup olmadığını kontrol eder.
REFERENTIAL Bir tablonun değerlerini referans alarak bir diğer tablonun değerlerini belirler
Satır PRIMARY KEY Bir alanda girilen değerlerin birbirinden farklı olmasını sağlar, bir tabloda sadece bir tane bulunur.
UNIQUE Bir tablonun bir ya da daha fazla alanında aynı değerden tekrar girilmemesini sağlar.
Diğer tablolarla ilişkili FOREIGN KEY Bir tablonun primary key olan alanı ile aynı ya da farklı bir tablonun  bir alanındaki değerlerin birbiri ile eşleştirilmesini sağlar.
CHECK Bir tabloda bir alana girilen değerleri,diğer alanlardaki değerleri göz önüne alarak geçerliliğine bakar.

Kısıtlamalar ALTER TABLE ya da CREATE TABLE ifadeleri ile tanımlanırlar. Bir tabloda kısıtlama tanımlamak için tabloyı yeniden yaratmaya gerek yoktur, yaratılmış tablo üzerinden kısıtlamalar tanımlanabilir. Tabloya bir kısıtlama eklendiğinde varolan bilgi o kısıtlama tarafından kontrol edilir.

"sp_helpconstraint" saklı yordamını kullanarak istenilen nesnenin kısıtlama bilgileri elde edilebilir.

"sp_helpconstraint object_name" şeklinde kullanılır.

DEFAULT Kısıtlaması :

Bir alanda "INSERT" ifadesinde girilmeyen bir değer olursa otomotik olarak belirlenmiş olan bir değerin atanmasını sağlar. Her alan için sadece bir tane varsayılan değer belirlenebilir. IDENTITY özelliği ile ve de timestamp veri tipi ile kulanılmaz.

Örnek: DEF_CONSTRAINT adında bir tablo olsun.



Tabloda job alanında varsayılan değer olarak 'n/ö' belirlemek istenirse Sorgu Çözümleyici (Query Analyzer)'de şu işlemler yapılabilir:



CHECK Kısıtlaması :

Kullanıcının bir alana gireceği değerleri sınırlandırır ve kontrol eder. INSERT ve UPDATE ifadeleri ile kullanılır. IDENTITY özelliği ile kullanılamaz. timestamp veuniqueidentifier veri tipleri ile kullanılamazlar.

Örnek: DEF_CONSTRAINT tablosunda isim alanında cengiz girilmemesini sağlamak için bir şu ifade  kullanılır:

Böylece isim alanında cengiz girmeye çalışırsak kabul edilmeyecektir.

PRIMARY KEY (Birincil Anahtar) Kısıtlaması:

PRIMARY KEY kısıtlaması bir tabloda bir birincil anahtar tanımlaması için kulanılır. Bir tabloda sadece bir tane birincil anahtar olabilir. Birincil anahtar (primary key) olarak tanımlanan o alanda girilen her değer birbirinden farklı olmak zorundadır. Null değeri tanımlanmasına izin verilmez ve otomotik olarak belirlenen o alanda bir içerik yaratılır.

Örnek: DEF_CONSTRAINT tablosunda o tablonun birincil anahtarı olacak şekilde surname alanına birincil anahtar özelliği tanımlansın:

UNIQUE Kısıtlaması:

Bir tabloda bir alanda aynı değerden tekrar girilmesini önler. Null değeri tanımlanmasına izin verir. Bir tabloda birden çok alan için UNIQUE değeri tanımlanabildiği için bir tabloda birden çok UNIQUE olabilir. Bir alanda UNIQUE değeri tanımlanınca, otomotik olarak Unique Index (Özel içerik) oluşur.

Örnek: DEF_CONSTRAINT tablosunda name alanını UNIQUE olarak tanımlamak için şu işlemi yapılır:



FOREIGN KEY (Yabancıl Anahtar) Kısıtlaması:

Birincil anahtar ya da UNIQUE olarak tanımlanmış (aynı tabloda ya da farklı tablolarda) iki alanın birbiri ile olan ilişkisini gösterir. Yabancıl anahtar kısıtlaması yaratılan alanda diğer alanda belirtilen değerler dışında başka bir değer girilemez. Bu kısıtlama yaratıldığında otomotik olarak dizin oluşmaz.

Örnek: FKEY1 ve FKEY2 diye 2 tablosu olsun.FKEY1 tablosu aşağıdaki şekilde, FKEY2 ise henüz veriye sahip olmayan bir tablo olsun:

FKEY2 tablosunda name ve surname adı altında iki alan var ve name ile FKEY1 tablosundaki name alanları arasında yabancıl anahtar tanımlamak istenirse ve kontrol amacı ile selin ismi girilmek istenirse, Sorgu Çözümleyici (Query Analyzer)'de şu kullanılır:

Görüldüğü gibi selin isminin kaydedilmesine izin vermedi; çünkü selin ismi FKEY1 tablosunda name alanında kayıtlı değil; kayıtlı olsaydı FKEY1 name alanında da girişine izin verilecekti.