Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ VERİ BÜTÜNLÜĞÜ VTYS’lerde veri bütünlüğünü sağlamanın iki temel yolu vardır; Tanımlanabilir veri bütünlüğü ve prosedürel veri bütünlüğü. Tanımlanabilir veri bütünlüğü, tanımlanan nesnelerin kendi özellikleri sayesinde sağlanabilen veri bütünlükleridir. Çok fazla müdahale ve programlama imkânı sağlamaz ama kullanımı çok basit bir tanımlamadan ibarettir. Prosedürel veri bütünlüğü ise bir programlama yaklaşımı ile bütünlüğün tasarlanmasını gerektirir. Prosedürel öğeler, Trigger’lar, Stored Procedure’ler veya programcılar tarafından yazılan üst seviyeli programlardır. 1. CONSTRAINTS (Kısıtlayıcılar) Veritabanı sistemlerinde veri bütünlüğünü sağlayabilmek için CONSTRAINTS olarak adlandırılan bazı zorlayıcı ifadeler kullanılabilir. Bunlar; NOT NULL DEFAULT PRIMARY KEY FOREIGN KEY CHECK UNIQUE IDENTITY() AUTO INCREMENT Boş değer içeremez Varsayılan değer Birincil anahtar Yabancı anahtar Değer kısıtlama Aynı veri bir kez bulunabilir Otomatik artış Tabloyu yaratırken Constraint kullanımı 1.1. NOT NULL Boş geçilmesini istemediğimiz sütunlarda kullanılır. Bu sütunlarda NULL değer oluşturacak SQL cümlelerinde hata oluşturur ve NULL değer girilmesini önler. Aşağıdaki örnek SQL cümlesinde OgrNo sütunu boş geçilemez. Create table Ogrenciler (OgrNo int NOT NULL, Ogr_adi varchar(20), Bolum varchar(20), Sehir varchar(20)) 1 Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ 1.2. DEFAULT Tablo içerisinde veri girişi yapılmak üzere değer verilmezse veri girişi için standart olarak atanacak değeri tanımlamakta kullanılır. Aşağıdaki örnek SQL cümlesinde Sehir sütunu boş geçildiği takdirde otomatik olarak bu sütuna ADANA değeri girilir. Create table Ogrenciler (OgrNo int NOT NULL, Ogr_adi varchar(20), Bolum varchar(20), Sehir varchar(20) DEFAULT 'ADANA') 1.3. PRIMARY KEY Tablo içerisinde birincil anahtar olarak belirlenecek sütun(lar)ı oluşturmak için kullanılır. Aşağıdaki örnek SQL cümlesinde OgrNo sütunu birincil anahtar olarak oluşturuluyor. Create table Ogrenciler (OgrNo int NOT NULL PRIMARY KEY, Ogr_adi varchar(20), Bolum varchar(20), Sehir varchar(20) DEFAULT 'ADANA') Bazı durumlarda birincil anahtar olarak belirlenen sütun sayısı birden fazla olabilir (Bkz. Varlık-İlişki modeli). Aşağıda kullanımıyla ilgili örnek verilmiştir. Create table Notlar (OgrNo int NOT NULL, Ders_kodu Varchar(6) NOT NULL, Vize int, Final int, CONSTRAINT pkkey PRIMARY KEY (ogr_no, ders_kodu)) Bu örnekte ogr_no ve ders_kodu sütunları birlikte birincil anahtarı oluşturmaktadırlar. CONSTRAINT ifadesinden sonra kullanılan pkkey oluşturulan birincil anahtara verilen isimdir. Bu ismi biz belirliyoruz. 2 Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ 1.4. FOREIGN KEY Tablo içerisinde yabancıl anahtar olarak belirlenecek sütun(lar)ı oluşturmak için kullanılır. FOREIGN KEY oluşturmakla iki tablo arasında bir ilişki kurmuş oluruz. FOREIGN KEY olarak oluşturulacak sütun başka bir tabloda birincil anahtar olarak belirlenen sütundur. FOREIGN KEY olarak oluşturulacak sütun içerisine girilecek veriler referans olarak kullanılan sütunda bulunmalıdır. Kayıt girişi esnasında referans sütunda bu değeri içeren veri yoksa SQL cümlemiz hata verecek ve kayıt işlemi gerçekleşmeyecektir. Aşağıdaki örnekte, NOTLAR tablosunun ogr_no sütunu ile OGRENCILER tablosunun birincil anahtar sütunu olan ogr_no sütunu ilişkilendirilmiştir. Yine aynı şekilde, NOTLAR tablosunun ders_kodu sütunu ile DERS tablosunun birincil anahtar sütunu olan ders_kodu sütunu ilişkilendirilmiştir. Çünkü NOTLAR tablosuna girilecek ogr_no ve ders_kodu bilgileri diğer tablolarda bulunmak zorundadır. Eğer 613 nolu öğrenci OGRENCILER tablosunda kayıtlı değilse NOTLAR tablosunda bu nolu öğrenci için girilmek istenen bilgiler kabul edilmeyecektir. Create table Notlar (OgrNo int NOT NULL, Ders_kodu Varchar(6) NOT NULL, Vize int, Final int, CONSTRAINT pkkey PRIMARY KEY (ogr_no, ders_kodu), CONSTRAINT fk_ogrno FOREIGN KEY (ogr_no) REFERENCES ogrenciler(ogr_no), CONSTRAINT fk_dkod FOREIGN KEY (ders_kodu) REFERENCES ders(ders_kodu) ) Tablolar arasında oluşturulan ilişkilerden dolayı referans olarak kullanılan tablolardan kayıt silme ve güncelleme işleminde hata vermesine neden olacaktır. Örneğin OGRENCILER tablosundaki 613 nolu öğrencinin NOTLAR tablosunda da bilgisi olduğunu düşünelim. Daha sonra bu öğrencinin numarasını güncellemek istediğimizi veya bu öğrenciyi silmek istediğimizi düşünelim. Bu durumda hata ile karşılaşacağız. Çünkü FOREIGN KEY ile kurduğumuz ilişki bu güncellemeyi veya silmeyi yapmamıza engel olacaktır. Bu tür sorunların engellenmesi için ilişkiler kurulurken silme (ON DELETE) veya güncelleme (ON UPDATE) işlemi için izin verilmelidir. Bu izne ardışık bütünlük ismi verilir. Ardışık bütünlük aşağıdaki seçeneklerden birinin devreye girmesini sağlayabilir. 3 Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ CASCADE FOREIGN KEY kullanılırken ON DELETE CASCADE ifadesi kullanılırsa referans tablodan silinen satırların kullanıldığı diğer tablolardan da ilgili satırlar silinecektir. Örneğin OGRENCILER tablosundan 613 nolu öğrenci silindiğinde NOTLAR tablosunda bu öğrenciye ait tüm bilgiler de otomatik olarak silinecektir. FOREIGN KEY kullanılırken ON UPDATE CASCADE ifadesi kullanılırsa referans tabloda güncellenen satırların kullanıldığı diğer tablolardan da ilgili satırlar güncellenecektir. Örneğin OGRENCILER tablosundan 613 nolu öğrencinin numarası 713 olarak güncellenirse NOTLAR tablosunda bu öğrenciye ait tüm satırlarda ogr_no sütunu otomatik olarak 713 değeriyle güncellenecektir. Create table Notlar (OgrNo int NOT NULL, Ders_kodu Varchar(6) NOT NULL, Vize int, Final int, CONSTRAINT pkkey PRIMARY KEY (ogr_no, ders_kodu), CONSTRAINT fk_ogrno FOREIGN KEY (ogr_no) REFERENCES ogrenciler(ogr_no) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT fk_dkod FOREIGN KEY (ders_kodu) REFERENCES ders(ders_kodu) ON UPDATE CASCADE ON DELETE CASCADE ) NO ACTION Birincil tarafta silmeye müsaade edebilmek için yabancı taraftaki bütün ilişkili satırların silinmiş olması şartını arar. Bir tane bile silinmemiş satır varsa, birincil taraftaki satırın da silinmesine izin vermez. Eğer belirtilmemişse varsayılan seçenek olarak NO ACTION seçeneği geçerlidir. SET DEFAULT Bir satır silindiğinde buna bağlı yabancı anahtar sütunu üstünde default değeri varsa, yabancı anahtar sütununa default değeri atanır. SET NULL Bir satır silindiğinde buna bağlı yabancı anahtar sütun NULL olabilir olarak tanımlı ise, yabancı anahtar sütununa NULL değeri atanır. 4 Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ 1.5. CHECK Tablo oluşturulurken bir sütun içerisine girilebilecek değerler için bir kısıtlama getirmek amacıyla kullanılır. Sütun için belirlenecek koşul tek bir şartı içeriyorsa CHECK ifadesi sütun isminden sonra yazılarak koşul belirtilir. Create table Notlar (OgrNo int NOT NULL, Ders_kodu Varchar(6) NOT NULL, Vize int CHECK (vize>=0), Final int CHECK (final >=0), CONSTRAINT pkkey PRIMARY KEY (ogr_no, ders_kodu)) Yukarıdaki gibi bir tanımlama yapıldığında vize ve final sütunlarına 0'dan küçük bir veri girilemez. Eğer sütun için birden fazla koşul belirtmemiz gerekiyorsa CHECK ifadesi CONSTRAINT olarak kullanılır. Create table Notlar (OgrNo int NOT NULL, Ders_kodu Varchar(6) NOT NULL, Vize int, Final int, CONSTRAINT pkkey PRIMARY KEY (ogr_no, ders_kodu), CONSTRAINT chkvize CHECK (vize>=0 AND vize<=100), CONSTRAINT chkfinal CHECK (final>=0 AND final<=100) ) Yukarıdaki şekilde oluşturulan tabloda vize ve final notu 0 ve 100 arasında girilmek zorundadır. CHECK ifadesiyle birlikte IN ve LIKE gibi operatörler de kullanılabilir. IN operatörü kullanıldığında verilen değerlerden birisinin seçilmesi gerekmektedir. LIKE operatörü ise joker karakterler ile birlikte kullanılabilir. CONSTRAINT chkkod CHECK (urun_kod IN ('A086', 'A087', 'A088', 'A089') OR urun_kod LIKE 'A10%') Yukarıdaki CHECK ifadesi urun_kodunun A086, A087, A088, A089 olmasını veya A10 ile başlamasını gerektirmektedir. 5 Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ 1.6. UNIQUE Bir sütunun aynı veriyi sadece bir kez içermesi isteniyorsa UNIQUE ifadesi kullanılır. Aşağıdaki örnek SQL cümlesinde Telefon sütununda aynı telefon numarası birden fazla bulunamaz. Create table Ogrenciler (OgrNo int NOT NULL, Ogr_adi varchar(20), Bolum varchar(20), Telefon varchar(10), Sehir varchar(20) DEFAULT 'ADANA', UNIQUE (Telefon) ) 1.7. IDENTITY (MS SQL) Bir sütunun içeriğinin otomatik olarak artması isteniyorsa sütun ismi ve veri tipinden sonra IDENTITY fonksiyonunu kullanmak gerekir. Fonksiyon içinde başlangıç değeri ve artım miktarı girilmelidir. Artım miktarı girilmezse 1 olarak alınacaktır. Bu durumda bu sütun için değer girmemize gerek kalmayacaktır. Her yeni kayıtta ilgili sütun bir sonraki numarayı alacaktır. Create table Ogrenciler (OgrNo int NOT NULL PRIMARY KEY IDENTITY(100,1) , Ogr_adi varchar(20), Bolum varchar(20), Sehir varchar(20) DEFAULT 'ADANA' ) AUTO INCREMENT (My SQL) Bir sütunun içeriğinin otomatik olarak artması isteniyorsa sütun isminden sonra AUTO INCREMENT ifadesini kullanmak yeterlidir. Bu durumda bu sütun için değer girmemize gerek kalmayacaktır. Her yeni kayıtta ilgili sütun bir sonraki numarayı alacaktır. Create table Ogrenciler (OgrNo int NOT NULL PRIMARY KEY AUTO INCREMENT, Ogr_adi varchar(20), Bolum varchar(20), Sehir varchar(20) DEFAULT 'ADANA' ) 6 Veritabanı Ders Notları (5) Öğr.Gör. Erkut TEKELİ 2. CONSTRAINT’leri yönetmek Bir tablo üstünde hangi Constraint’lerin tanımlı olduğunu görebilmek için çeşitli yollar vardır: 1. Management Stodio ile tablo özelliklerine göz atarak Constraint’leri ve özelliklerin görebiliriz. 2. Sp_helpconstraint ‘tablo_ismi’ komutunu yazarak tablodaki constraint’leri ve türleri görülebilir. 3. Sp_help ‘constraint_tipi’ komutu ile bir constraint tanımı hakkında detaylı bilgilere erişebiliriz. CONSTRAINT’leri silmek ALTER TABLE tablo-ismi DROP CONSTRAINT constraint-ismi CONSTRAINT’leri denetime kapamak ve açmak Constraint’lerin veritabanında bazen anlık olarak denetlemesi istenmez. Bir süre için Constraint’leri susturmak gerekebilir. Bu türden durumlarda şu genel ifadeden yararlanacağız; ALTER TABLE tablo-ismi NOCHECK CONSTRAINT constraint-ismi veya ALL İlgili işlemler yapıldıktan sonra tekrardan Constraint’leri açmak için; ALTER TABLE tablo-ismi CHECK CONSTRAINT constraint-ismi veya ALL 7