CodeGym/Java Kursu/All lectures for TR purposes/KISITLAMA: veritabanı bütünlüğü

KISITLAMA: veritabanı bütünlüğü

Mevcut

Veritabanı bütünlük kontrolü

Veritabanları hakkında bilinmesi gereken bir diğer önemli şey de KISITLAMALAR'dır. Kısıtlamalar yardımıyla tablolarınızdaki veri değişikliklerini kontrol edebilir, bütünlük ve tutarlılığını koruyabilirsiniz.

Bir veritabanı hakkında konuştuğumuzda veri tutarlılığı nedir ?

Çalışan, ürün ve görev tabloları ile online mağazamızı ele alalım . Görev tablosunda kimseye atanmamış görevler olabileceğini zaten biliyoruz: bu tür satırların çalışan_kimliği NULL'dur.

Ancak, görev tablosunda çalışan_kimliği örneğin 115'e eşit olan bir giriş varsa ne olur? Sonuçta böyle bir çalışanımız yok. Çalışan tablosunda id=115 olan bir çalışanımız yok. Aynı zamanda, görev tablosunda bu kimliğe sahip bir çalışanın bağlantısı bulunur. Bu, veri tutarsızlığına bir örnektir .

Peki bu verileri nasıl uzlaştıracağız? İdeal olarak, herhangi bir veri değişikliğinde SQL sunucusunun tüm bu nüansları kontrol etmesi gerekir. Ve böyle bir fırsat var, buna FOREIGN_KEY denir.

Tablonuzdaki bazı sütunlar yalnızca sayıları değil, başka bir tablodan id satırlarını içeriyorsa, bu açıkça belirtilebilir.

YABANCI ANAHTAR Ekleme

Böyle bir anahtar, tabloya hem oluşturma aşamasında hem de sonrasında ALTER TABLE kullanılarak eklenebilir. Biçim temelde farklı değildir. Her iki seçeneği de sunacağız.

Böyle bir anahtarın/kuralın genel biçimi şöyledir:

FOREIGN KEY (column)
  	REFERENCES table(column)

Tablodaki tüm çalışan_kimliklerinin çalışan tablosundaki mevcut bir girişe atıfta bulunduğundan emin olmak için bu anahtarı/kuralını görev tablosuna ekleyelim . Bu betik şöyle görünecek:

ALTER TABLE task
      ADD FOREIGN KEY (employee_id)
  	REFERENCES employee(id)

Görev tablosunu oluştururken bu kuralı eklemeye karar verirsek, kod şöyle görünür:

CREATE TABLE task (
      id INT,
      name VARCHAR(100),
      employee_id INT,
      deadline DATE,
 
      PRIMARY KEY (id),
  	  FOREIGN KEY (employee_id)  
	      REFERENCES employee(id)
);

Bu arada, başvurduğumuz dizenin benzersiz bir bileşik anahtarı olduğu durumlar vardır: örneğin, "Ad ve doğum yılı" veya "productCatogoryId ve productId". O zaman YABANCI ANAHTAR şu şekilde yazılabilir:

FOREIGN KEY (our_column1, our_column2)
  	REFERENCES table(their_column1, their_column2)

YABANCI ANAHTAR ve değişen veriler

Şimdi, çalışan tablosundaki bazı verileri güncellemeye karar verdiğimiz ve çalışan kimliğimizin değiştiği bir durum hayal edin. Görev tablosundaki verilere ne olacak? Doğru, ilgisiz hale gelecekler ve veritabanımızın bütünlüğü ihlal edilecek.

Bunun olmasını önlemek için SQL Server'a, çalışan tablosundaki kimlik değiştiğinde, bu belirli değiştirilmiş kimliğe başvuran tüm tablolardaki tüm satırların çalışan_kimliğini değiştirmesini söyleyebilirsiniz.

Bu tür betiklere OnUpdate ve OnDelete denir . Kayıt kimliği değişirse ne yapmalı ve kayıt silinirse ne yapmalı?

Kaldırma ile her şey o kadar basit değil. Veritabanında birbirine başvuran dizelerle temsil edilen bağımlı nesneleriniz varsa, bir nesneyi silerken çok çeşitli davranış senaryoları mümkündür.

Diyelim ki bir site kullanıcısını sildik, bu onun tüm kişisel yazışmalarını silmemiz gerektiği anlamına geliyor. Ancak, kamuya açık tüm yorumlarını kaldırmamız pek olası değildir.

Veya bir çalışan istifa eder. Ayrılırsa ve aynı zamanda kendisine atanan tüm görevler veri tabanından kaybolursa garip olurdu. Ama onun tarafından atanmamış kalsalardı, o da kötü sonuçlanacaktı. Çalışanın tüm görevlerini başka kişilere devrettikten sonra istifa edebilmesi için yapılması daha doğrudur.

YABANCI ANAHTAR kullanarak bu senaryoları şu şekilde açıklayabiliriz. Böyle bir anahtarın/kuralın genel biçimi şöyledir:

FOREIGN KEY (column)
  	REFERENCES table(column)
 	[ON DELETE reference_option]
 	[ON UPDATE reference_option]

Kayıtların silinmesi (ON DELETE) veya değiştirilmesi (ON UPDATE) durumunda ne yapılmalı? Toplamda, SQL sunucusunun bu durumların her birinde işlem yapması için 5 seçenek olabilir:

# referans_seçenek Açıklama
1 KISITLAMAK Dize referansları bulunursa eylemi devre dışı bırakın
2 ÇAĞLAYAN Bağımlı satırlarda kimliği değiştir
3 BOŞ AYARLA Bağımlı satırlardaki kimliği NULL olarak ayarla
4 HİÇBİR EYLEM Yapacak bir şey yok
5 VARSAYILAN x'i AYARLA Kimliği bağımlı havuzlarda x olarak ayarlayın

Görev tablomuzu şu şekilde değiştirebiliriz:

ALTER TABLE task
  	ADD FOREIGN KEY (employee_id)
  	REFERENCES employee(id)
  	ON UPDATE CASCADE
  	ON DELETE RESTRICT;

Burada yazılanlar:

ON UPDATE CASCADE : Çalışan tablosundaki id anahtarı değişirse, ona başvuran görev tablosunda çalışan_kimliğini de değiştirin.

ON DELETE RESTRICT : Çalışan tablosundan bir satır siliniyorsa ve görev tablosundan referans veriliyorsa, satırın çalışan tablosundan silinmesini engelleyin.

Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok