CONSTRAINT (kısıtlama), veritabanı tablolarında veri bütünlüğünü sağlamak için kullanılan kurallardır. Tabloya eklenecek verilerin belirli koşulları ve durumları sağlamasını zorunlu kılar.
T-SQL’de başlıca CONSTRAINT türleri:
- DEFAULT CONSTRAINT
- FOREIGN KEY CONSTRAINT
- UNIQUE CONSTRAINT
- CHECK CONSTRAINT
- PRIMARY KEY CONSTRAINT
Yukarıdaki CONSTRAINT türlerini sıralı ile açıklayalım:
DEFAULT CONSTRAINT: Belirtilen sütuna değer girilmediğinde otomatik olarak atanacak değeri belirlemektedir.
Temel Söz Dizimi:
ALTER TABLE [TABLE_NAME]
ADD CONSTRAINT [CONST_NAME] DEFAULT 'VARSAYILAN_DEGER' FOR [TABLE_KOLON]
Şimdi örnek üzerinden konumuzu daha iyi anlamış olalım.
ALTER TABLE [dbo1].[Kullanicilar]
ADD CONSTRAINT CONST_NAME DEFAULT 'YOK' FOR AdSoyad1

Aşağıdaki komutla insert işlemi yapıldığında constraint tanımlanan kolon için herhangi bir değer dönmemiştir. Buda constraint yapımızın tabloya uygulanmasına sebep olacaktır.
insert into [dbo].[Kullanicilar](KullaniciID) values(100)
insert into [dbo].[Kullanicilar](KullaniciID) values(101)
insert into [dbo].[Kullanicilar](KullaniciID) values(102)

CHECK CONSTRAINT: Sütüna girilecek değerleri belirli bir şarta göre kontrol edildikten sonra kaydedilme durumudur. Row bazında çalışır. Null Değerlerin insert edilmesine izin verir.
Temel Söz Dizimi:
ALTER TABLE [TABLE_NAME]
ADD CONSTRAINT [CONST_NAME] CHECK(ŞART_İFADESİ)
Aşağıdaki komut ile kolonumuza eklenecek her değer için belirli kontrol işlemi sağlanarak ilgili şart biçiminde veri ekleme işlemi yapılmaktadır.
Eğer kullanıcı tablosuna sonradan check constraint oluşturmak istiyorsa uygulan kolondaki değerlerin check constraint yapısına uyması gerekir. Uyumsuzluk varsa check constraint yapısı oluşmaz.
Önceki verilerin işleme katılmamasını yeni eklenecek ifadelerin sadece işleme almasını sağlayacak yapı With NoCheck yapısıdır. Aşağıdaki resimde bu yapıyı görebiliriz.
ALTER TABLE [TABLE_NAME]
WITH NOCHECK ADD CONSTRAINT [CONST_NAME] CHECK(ŞART_İFADESİ)
PRIMARY CONSTRAINT: Tablodaki her satırı benzersiz şekilde tanımlar. Hiç bir zaman NULL değer içermez. Bir tabloda sadece 1 tane olmaktadır. Bu constraint yapısı ile eklenen primary key başka tablolarda foreign key oluşturarak ilişki kurmamızı sağlamaktadır. Primary key oluşturulan constraint otomatik olarak Clustered Index olmaktadır. İlgili satırın tekil olması sağlanmaktadır.
Temel söz dizimi:
alter table TABLO_ADI
add constraint CONSTRAINT_ADI primary key(KOLON_ADI)
Aşağıdaki komut ile ilgili kolona primary key olarak tanımlayabiliriz.
alter table kullanicilar
add constraint PK_ID primary key(KullaniciID)
Birden fazla kolona aşağıdaki gibi constraint oluşturulabiliriz.
alter table kullanicilar
add constraint PK_ID primary key(KullaniciID, MusteriID)
UNIQUE CONSTRAINT : Belirlediğimiz kolondaki değerlerin tekil olması sağlanmaktadır. Primary key constraint ile arasındaki fark primary key başka tablolarla ilişkilendirilebilirken unique constraint sadece tekilliği sağlamaktadır. Ayrıca primary key üzerinde hiç bir kayıt null olamazken unique yapısında ise 1 null değeri olabilir. İkinci null tekilliği bozmaktadır. Her tabloda birden fazla Unique Constraint olabilir. Default olarak bir kolona unique constraint koyarsanız o kolon üzerinde non clustered index oluşur.
Temel söz dizimi:
alter table TABLO_ADI
add constraint CONSTRAINT_ADI unique (KOLON_ADI)
Aşağıdaki komut ile tablomuzun ilgili kolonunu unique yapıda oluştururuz. kolon üzerinde önceden olan değerlerin birbirinden farklı olması gerekmektedir. Yoksa hata mesajıyla karşılaşırız.
alter table kullanicilar
add constraint Unıque_kolon1 unique(kolon1)
Tekilliği bozan bir değer girildiği zaman aşağıdaki gibi hata mesajıyla karşılaşmış oluruz.

FOREIGN KEY CONSTRAINT: FOREIGN KEY (yabancı anahtar), bir tablodaki bir sütunun başka bir tablonun PRIMARY KEY’ine referans vermesini sağlayan bir kısıtlamadır. İlişkisel veritabanlarında tablolar arası ilişki kurmak için kullanılır. Bir tablodaki verinin başka bir tabloda karşılığı olmasını garanti eder. Foreign key kolonundaki verinin boşa düşmemesi için primary key olan kolondan veri silinmesini ve güncellemesini engeller. Silme ve güncelleme işlemlerinde davranışını belirleyebiliriz. (CASCADE, SET NULL, RESTRICT, vs.)
Temel Söz Dizimi:
ALTER TABLE TABLO_ADI
ADD CONSTRAINT CONSTRAINT_ADI FOREIGN KEY(KOLON_ADI) REFERENCES 2_TABLO(2.TABLO_KOLON)
Aşağıdaki komutla bu özelliği gerçek sistem üzerinde yapabiliriz.
ALTER TABLE Siparisler
ADD CONSTRAINT fgconst_KullaniciID FOREIGN KEY(KullaniciID) REFERENCES Kullanicilar(KullaniciID)
Bu şekilde join işlemlerimizde bağımlı olan tablolarımızı rahatlıkla çağırabiliriz.
select*from Kullanicilar k join Siparisler s on s.KullaniciID=k.KullaniciID
Bu kolonlar birbirine bağımlı olduğu için silme işlemlerinde sıkıntıya sebebiyet vermektedir.
FOREIGN KEY Davranış Seçenekleri:
- ON DELETE CASCADE: Ana tablodan bir kayıt silindiğinde, ona bağlı tüm kayıtlar otomatik silinir.
- ON DELETE SET NULL: Ana tablodan bir kayıt silindiğinde, yabancı anahtar NULL olarak ayarlanır.
- ON DELETE RESTRICT/NO ACTION: Bağlı kayıtlar varsa silmeyi engeller.
- ON UPDATE CASCADE: Ana tablodaki PRIMARY KEY güncellendiğinde, yabancı anahtarlar da otomatik güncellenir.
Yukarıdaki ifadelerin constraint tanımlanırken constraint sonrasında tanımlanması gerekmektedir.
ALTER TABLE Siparisler
ADD CONSTRAINT fgconst_KullaniciID FOREIGN KEY(KullaniciID) REFERENCES Kullanicilar(KullaniciID)
on delete cascade
on update cascade
ON DELETE SET DEFAULT ve ON UPDATE SET DEFAULT ilgili parametreler kullanıldığında ilgili kaynak tablodan bir değer silindiğinde Hedef tabloda default constraint değeri set edilecektir. Foreign tanımladığımız tablo kaynak tablo olmaktadır.
Bir constraint’i silmek için aşağıdaki komut kullanılmaktadır.
ALTER TABLE TabloAdi
DROP CONSTRAINT ConstraintAdi;
Bu makalede constraint konularını detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle..
“(Ey Muhammed!) Yüz çevirirlerse de ki: Allah bana yeter. O’ndan başka ilâh yoktur. Ben sadece O’na güvenip dayanırım. O yüce Arş’ın sahibidir.” Tevbe Suresi; 129. Ayet