Tablo Oluşturmada Kısıtlamalar ( Constraints ) – 2

Bir önceki yazıda tablo oluşturmadaki kısıtlamaların neler olduğunu söylemiştik ve anlatmaya başlamıştık. Şimdi kaldığımız yerden devam edelim.

UNIQUE KEY (TEKİL ANAHTAR) :

Her ne kadar birincil anahtarlar ile tekrarı önleyebilsek de aslında birincil anahtar olmayan fakat yine de tekrar etmesini istemediğimiz alanlar olabilir. Böyle durumlar için UNIQUE anahtar sözcüğü kullanılır. Primary Key (birincil anahtar) ve Unique birbirine çok benzer ancak bir tabloda birden fazla unique olabilirken, birden fazla primary key olamaz. Unique bir alan sadece bir kez olmak üzere boş bırakılabilirken, primary key bir alan hiçbir zaman boş bırakılamaz. Aralarındaki fark budur.

Şimdi bunu bir örnekle açıklayalım.

Burada Calisanlar adında bir tablo oluşturulmuştur. Bu tabloda birincil anahtar olabilecek NUMARA ve [TC NO] adında iki alan mevcuttur. Ancak biz sadece birini birincil anahtar olarak belirledik ama diğerinin de tekrarlanmamasını istediğimiz için kodda görüldüğü gibi [TC NO] alanı için veri tipi tanımlamasından sonra UNIQUE anahtar sözcüğünü kullandık. Bunun anlamı; [TC NO] birincil anahtar değil ancak yine de tekrarlanamaz. Sadece bir defa girilebilir.

Bu kodu Execute yaparak çalıştıralım.

Command(s) completed successfully mesajını gördüğümüze göre kodumuz hatasız çalıştırıldı. root veritabanımızın içerisinde Calisanlar tablosu başarılı bir şekilde oluşturuldu. Edit Top 200 Rows diyerek tablomuza örnek kayıt girişi yapalım.

Görüldüğü gibi TC NO’yu tekrar 2 girdiğimizde hata aldık. Çünkü bu alan unique bir alandır ve tekrarlanamaz. Sadece bir defa girilebilir.

FOREIGN KEY (YABANCI ANAHTAR) :

Foreign key, tablolar arasındaki ilişkilendirmedir. İlişkisel veri tabanı tasarımında bir başka tablo ile ilişkilendirilecek olan tablonun, diğer tabloda kısıtlanması anlamına gelir. İlişkilendirilecek olan tablonun Primary key alanı ile diğer tablonun Foreign key alanı birbiri ile bağlanır.

Şimdi bunu SQL kodu yazarak gösterelim.

Yukarıdaki Ogrenciler tablosuna bakalım. Burada dikkat edilirse [BÖLÜM] alanı aslında başka bir tablodan referans alıyor. Yani Ogrenciler tablosundaki [BÖLÜM] alanı aslında Bolumler tablosundaki birincil anahtar olan Bolum_Kodu alanına referans ediyor.

Yukarıdaki SQL kodunda referans verilirken yazılan FOREIGN KEY kısmı isteğe bağlıdır. Yazılmazsa da olur. Önemli olan REFERENCES anahtar sözcüğünün yazılmış olmasıdır.  Bir tabloda sadece bir tane birincil anahtar bulunabilir, fakat birden fazla yabancı anahtar bulunabilir.  Bu durumda her referans için ayrı referans verilir.

Yukarıda yaptığımız örnekte [BÖLÜM] alanının referansını belirttikten sonra “ON DELETE CASCADE” ve  “ON UPDATE CASCADE” ifadelerini kullandık. Bunun anlamı şudur: Eğer referans edilen kayıt silinirse veya güncellenirse bu tabloda da aynı değişikliği yap demektir.

Bolumler tablosundaki Bolum_Kodu BM1 olan bölümü sildik.

Görüldüğü gibi BM1 bölümüne kayıtlı bütün öğrenciler de silindi.

Bolumler tablosunda BM1 olan Bolum_Kodu’nu BP1 yaptık.

Görüldüğü gibi Ogrenciler tablosunda BÖLÜM BM1 olan bütün öğrenciler için BÖLÜM BP1 olarak güncellendi.

Böyle bir durum istemiyor da olabilirdik, yani Bolumler tablosundan bir bölüm sildiğimizde Ogrenciler tablosundaki o bölüme ait öğrencilerin silinmesini istemeyebilirdik. O zaman “ON DELETE CASCADE” yerine “ON DELETE NO ACTION” yazmamız gerekirdi. Aynı durum güncelleme işlemi için de geçerlidir. Yani Bolumler tablosundan bir Bolum_Kodu güncellenince, Ogrenciler tablosundaki o bölüme kayıtlı öğrencilerin bölüm kodu güncellenmesin istiyorsak “ON UPDATE CASCADE” yerine “ON UPDATE NO ACTION” yazmalıyız.

Eğer Bolumler tablosundaki bir kayıt silinince Ogrenciler tablosunda o bölüme kayıtlı öğrenciler silinmesin fakat Bolum_Kodu güncellenince Ogrenciler tablosundaki o bölümün kodları güncellensin istiyorsak bu durumda da “ON DELETE NO ACTION ON UPDATE CASCADE” şeklinde yazmalıyız.

Aynı mantık tam tersi için de geçerlidir.

Referans anahtar tanımlanırken bu kuralı göz önüne almamız gerekmektedir.

Evet bugünlük bu kadar, bir sonraki yazımızda kalan constraintlere devam 🙂

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir