Merhaba arkadaşlar,
Daha önceki yazımızda sütun seviyesinde veri bütünlüğünü incelemiştik. Bu yazımızda da tablo boyutunda veri bütünlüğünü inceleyeceğiz.
Tablo boyutunda veri bütünlüğünü temelde iki şekilde sağlayabiliriz.
Kolonlar Arası Constraint ile:
Bu versiyonda veri girişinde bir birine bağımlı olan kolonlar arasında CHECK constraint ayarlanarak veri bütünlüğü sağlanabilir. Örneğin: Kişiler tablosunda kayıt tarihi alanının doğum tarihi kolonundan büyük olma şartı gibi.
CREATE TABLE Kisiler(
Id INT PRIMARY KEY IDENTITY,
Ad NVARCHAR(50) NOT NULL,
DogumTarih DATETIME,
KayitTarih DATETIME,
CONSTRAINT Kayit_Tarih_Kontrol CHECK (KayitTarih > DogumTarih)
)
Foreign Key Ayarlama:
Tablonun belli bir alanına girilen değerin başka bir tablonun tekil alanında olma şartı durumunda foreign key kullanılır. Örneğin: Kişiler tablosunda “Unvan_Kodu” alanı olsun. Bu alana girilen değerin Unvanlar tablosunda olması gerekmektedir. Aksi durumda kişinin unvanını gösteren koda karşılık bir unvan olmadığından tutarsızlık meydana gelecektir.
Foreign key olarak tanımlanan alan NULL değer taşıyabilir. Mesela kişiyi veri tabanına ilk kayıtta unvanı tanımlanmamış olabilir, bu durumda unvan tanımlanana kadar alan NULL değer olarak atanacaktır.
- Foreign Key SQL Kullanarak Tanımlama
CREATE TABLE tablo_ismi(
-- sutun tanımları
CONSTRAINT foreign_key_adi FOREIGN KEY(foreign_key_tanımlanılacak_kolon_adı) REFERENCES ikinci_tablo_adı(ikinci_tablo_tekil_kolon_adı)
)
Öncelikle referans alacak ve referans alınan tablolar database diyagrama eklenmeli, daha sonra referans alacak olan Kisiler.UnvanKod kolonu sürüklenerek Unvanlar tablosu üzerine bırakılır. Bu işlemden sonra aşağıdaki ekran açılacaktır. Bu ekranın sol tarafında Unvanlar tablosunun UnvanKod kolonundan referans alınacağını ve sağ tarafında da Kisiler tablosunun UnvanKod alanının referans alacağını belirtiliyor.
Foreign key tanımında referans alınan kolonda değişiklik veya silme olması durumunda referans alan kolonda hangi işlemin olması gerektiğini de belirtmemiz gerekmektedir aksi durumda bir veri tutarsızlığı durumu ortaya çıkar. Mesela daha önce “Müdür” unvanının kodu 1, “Şef” unvanının kodunun 2 olduğunu varsayalım. Herhangi bir sebepten dolayı “Müdür” unvanının kodu 2 olarak değiştirilmesi gerekirse ve bu değişiklik Kisiler tablosuna da işlenmezse daha önce şef pozisyonunda olan her bir kişi veri tabanında artık müdür olarak görünecek. Bunun önüne geçmek için SQL Server foreign key alanı üzerinde ON DELETE ve ON UPDATE işleminde hangi işlemin olacağını belirtebiliriz.
İfadenin genel tanımı aşağıdaki gibidir:
ON {DELETE | UPDATE} {CASCADE | NO ACTION | SET DEFAULT | SET NULL}
- ON DELETE: Referans alınan değer silindiğinde
- ON UPDATE: Referans alınan değer güncellendiğinde yapılacak işlemi ifade eder.
Bu ifadelerden sonra girilecek değerler:
- CASCADE: Referans alınan değer üzerinde yapılan değişiklik referans alan değerler üzerinde de işlenir. Referans alınan değerin silinmesi durumunda referans alan kayıtlar da silinir.
- SET DEFAULT: Referans alınan değerin silindiğinde, referans alan kayıtta bir default tanım var ise değer default olarak değiştirilir.
- SET NULL: Referans alınan değerin silindiğinde, referans alan kayıt NULL değer kabul ediyor ise değer NULL olarak değiştirilir.
- NO ACTION: Referans alınan değer silindiğinde, referans alan bir kayıt var ise silinmesine müsaade edilmez, varsayılan olarak atanan işlem budur.
Bu işlem SQL Managenet Studio üzerinden yapıldığında aşağıdaki ekranda görünen alandan yapılabilir.