VERİ BÜTÜNLÜĞÜ

advertisement
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
Download