Transact Sql-Constraintler(Kısıtlayıcılar)
Bu yazımda T-SQL de Constraint(Kısıtlayıcı) lardan bahsedeceğim.Constraintler sayesinde tablolar üzerinde istediğimiz şartlar ve durumlara göre kısıtlamalar yapabiliyoruz.
Constraintler beş tanedirler.Bunlar,
CONSTRAINTLER (KISITLAYICILAR)
1. DEFAULT CONSTRAINT
2. CHECK CONSTRAINT
3. PRIMARY KEY CONSTRAINT
4. UNIQUE CONSTRAINT
5. FOREIGN KEY CONSTRAINT
1.DEFAULT CONSTRAINT
Default constraint sayesinde kolona bir değer girilmediği taktirde varsayılan olarak ne girilmesi gerektiğini ayarlayabiliyoruz.
Genel yapısı şu şekildedir.
add constraint –isim- default ‘varsayılan değer’ for –kolonadı-
Öncelikle “Northwind” veritabanında çalıştığımızı ikaz ediyorum.”Create” komutuyla “deneme” adında bir tablo oluşturalım ve ona default constraint oluşturalım.
create table deneme ( Id int primary key identity(1,1), Denemea varchar(20), Denemeb varchar(20) )
Şimdide bu tablodaki “Denemea” adlı kolona default constraint yazalım.Yani bu kolona değer girilmediği zaman “Boş” yazdıralım.
alter table deneme add constraint dc_deneme default 'Boş' for Denemea
“alter” komutuyla “deneme” adlı tabloda çalışma yapacağımızı söyledik.
“dc_deneme” adında “default” tipinde bir constraint oluşturduk.”Denemea” kolonuna veri gönderilmediği zaman “Boş” yazılacaktır.
insert deneme(Denemeb) values('deneme')
select * from deneme
Yukarda gördüğünüz gibi “Denemeb” kolonuna veri gönderiliyor ama “Denemea” kolonuna gönderilmiyor.Select sorgusu çalıştığı zaman “Denemeb” kolonunda “deneme” yazısı görülecektir.”Denemea” kolonunda ise “Boş” yazısını göreceğiz.
Bir başka örnek,
alter table deneme add constraint dc_deneme default getdate() for Denemea
Adı “dc_deneme” olan “default” tipte olan constraint ekleniyor ve “Denemea” kolonu boş bırakıldığında “getdate()” metoduyla o anın tarihi ekleniyor.
2.CHECK CONSTRAİNT
Bir kolona girilecek olan verinin belirli bir şarta uymasını zorunlu tutar.
Genel yapısı şu şekildedir,
Add constraint -isim- check (şart)
“deneme” adlı tablomuz üzerinden örneklere devam edelim.
alter table deneme add constraint cc_deneme check (Year(denemea)<1980)
Adı “cc_deneme” ve tipi “check” olan şartıda (Year(denemea)“denemea” kolonuna yılı 1980 yılından büyük tarih giremeyiz.Girersek kayıt işlemi gerçekleşmeyecektir.Şarta uyarsak gerçekleşecektir.
DİKKAT!!
Şimdi ben “denemea” kolonuma check constraint yazacağım.Ve şartım şu olacak.”denemea” kolonuna 1990 yılından küçük kayıtları alma.Ancak şöyle bir durum varki constraint i yazmadan önce benim bu kolonumda 1990 yılından küçük kayıtlarım var varsayalım.İşte bu constrainti oluşturmamıza izin vermez.Çünkü “senin tablonda zaten 1990 dan küçük kayıtlar var kardeşim” diyecektir.
alter table deneme add constraint cc_deneme check (YEAR(denemea)>1980) Msg 547, Level 16, State 0, Line 1 The ALTER TABLE statement conflicted with the CHECK constraint "cc_deneme". The conflict occurred in database "Northwind", table "dbo.deneme", column 'denemea'. HATA MESAJI BUNU VERECEKTİR.
Ancak ben istiyorum ki bundan sonra ki kayıt işlemlerinde bu istediğim şartı gerçekleştirmek istiyorum.İşte bu durumda add önüne ekleyeceğimiz “with nocheck” komutu imdadımıza yetişecektir.
With nocheck : Kolonda şu ana kadar yapılmış kayıtları görmezden gelip,bundan sonraki kayıtları istediğimiz şarta göre ayarlar.
alter table deneme with nocheck add constraint cc_deneme check (YEAR(denemea)<1980)
Artık 1980 yılından küçük kayıt yapmamıza izin vermeyecektir.
3. PRIMARY KEY CONSTRAINT
Primary Key Constraint ile, o kolona eklenen primary key ile, başka tablolarda foreign key oluşturarak ilişki kurmamız mümkün olur. Bunun yanında o kolonun taşıdığı verinin tekil olacağı da garanti edilmiş olur. Primary key constraint ile ayrıca CLUSTERED index oluşturulmuş da olur.
Genel kullanımı şu şekildedir,
add constraint –isim- primary key (-kolon adı-)
Tabi bu constraintte kullandığımız kolon identity özelliğine sahip olmalıdır.
ALTER TABLE DENEME ADD CONSTRAINT PRMKC_DENEME PRIMARY KEY (ID)
Adı “PRMKC_DENEME” olan ve tipi “PRIMARY KEY” olan “ID” kolonunda işlem yapan constraint.
4. UNIQUE CONSTRAINT
Unique constraintin tek amacı,belirttiğimiz kolondaki değerlerin tekil olmasını sağlamaktır.
Genel yapısı şu şekildedir,
add constraint –isim- unique (-kolon adı-)
ALTER TABLE DENEME ADD CONSTRAINT UC_DENEME UNIQUE (DENEMEA)
“DENEMEA” kolonuna unique constraint verilerek tekil hale getirilmiştir.Bundan sonra ikitane aynı veriden kayıt yapılamamaktadır.
5. FOREIGN KEY CONSTRAINT
Tabloların kolonları arasında ilişki kurmamızı sağlar. Bu ilişki neticesinde, primary key kolonu olan tablodan veri silinmesini, güncellenmesini engeller.(foreign key olan kolondaki karşılığının boşa düşmemesi için)
Genel yapısı şu şekildedir,
Add constraint –isim- foreign key (-kolon adı-) references -2.tablo adı-(-2. Tablodaki kolon adı-)
Şimdi foreign key constrainti gösterebilmek için iki tablo oluşturalım.
create table deneme1 ( Id1 int primary key identity(1,1), kolon1 nvarchar(50) ) create table deneme2 ( Id2 int primary key identity(1,1), kolon2 nvarchar(50) )
“deneme1” adlı tablodaki “Id1” kolonunu foreign key yapıp, “deneme2” tablosundaki “Id2” kolonuna bağlayalım.
alter table deneme1 add constraint frc_deneme foreign key (Id1) references deneme2(Id2)
“deneme1” tablosundaki “Id1” kolonunu foreign key yap.Bunu “deneme2” tablosundaki “Id2” kolonuna bağla.Bu constraintin adı “frc_deneme” olsun.
Yukarıdaki işlem yapıldıktan sonra “deneme2” tablosundan “deneme1” tablosunda karşılığı olan bir veri silinmez ya da güncellenemez.
Peki delete ve update durumlarında ilişkili kolondaki verilen davranışı değiştirmek için “cascade,set null,set default” ayarları verilir.Bu ayarlar verilmediği taktirde “no action” geçerlidir.
Cascade : Ana tablodaki kayıt silindiğinde ya da güncellendiğinde , ilişkili kolondaki karşılığıda otomatik olarak silinir ya da güncellenir.
Set Null : Ana tablodaki kayıt silindiğinde ya da güncellendiğinde , ilişkili kolondaki karşılığına “Null” değer basılır.
Set Default : Ana tablodaki kayıt silindiğinde ya da güncellendiğinde , ilişkili kolondaki karşılığına o kolonun default değeri basılır.Bu default değer dediğimiz default tipte bir constrainttir.Bunu kendimiz oluşturabiliriz.
alter table deneme1 add constraint fccc_deneme foreign key (Id1) references deneme2(Id2) on delete cascade
Farklı örnek.
alter table deneme1 add constraint fccc_deneme2 foreign key (Id1) references deneme2(Id2) on update cascade
