İlişkili tablolar (örneğin, "siparişler" ve "müşteriler") ilişkisel veritabanlarında en başından beri mevcuttur, ancak erken dönemlerde bütünlük kontrolü, manuel olarak program mantığı ile sağlanıyordu. SQL'in gelişmesiyle birlikte yerleşik kısıtlamalar (FOREIGN KEY) ve otomatik işlemler (CASCADE) ortaya çıktı.
Konu tarihi:
Başlangıçta veritabanları, "askıda kalan" kayıtların olmaması için bütünlüğü sağlamak için mekanizmalara ihtiyaç duyuyordu (örneğin, var olmayan bir müşteri için sipariş). FOREIGN KEY bir standart haline geldi ve CASCADE seçenekleri, silmeler ve değişiklikler sırasında senkronizasyonu otomatikleştirdi.
Sorun:
Kaskad eylemleri olmadan, ana tabloda bir satırın silinmesi veya güncellenmesi hatalara veya "yetim" verilere yol açar. Bu görevi uygulamaya yüklemek genellikle karmaşık destek gerektirir ve büyük işlemlerde olay riski taşır. Kaskad eylemlerinin yanlış kullanımı, zincirleme silmelere veya iş mantığının ihlaline neden olabilir.
Çözüm:
ON DELETE CASCADE ve ON UPDATE CASCADE ile FOREIGN KEY kullanımı, otomatik olarak bütünlüğü sağlamaya ve ilişkili tabloları doğru bir şekilde senkronize etmeye olanak tanır. Karmaşık senaryolar (örneğin, silmenin yanı sıra eylemleri kaydetme gereksinimi) için tetikleyiciler kullanılır.
Kod örneği:
CREATE TABLE Customers ( CustomerID INT PRIMARY KEY, Name NVARCHAR(100) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, Amount DECIMAL(10,2), FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE ON UPDATE CASCADE );
Anahtar özellikler:
Kaskad silme her ilişki için en iyi uygulama mıdır?
Hayır: "tarihi" veriler veya arşiv bilgileri için kaskad silme değerli bilgilerin kaybolmasına neden olabilir. Her ilişki türünün iş değerini anlamak önemlidir.
ON UPDATE CASCADE, dış anahtarın ana tablonun PRIMARY KEY'ine dahil olmadığı durumlarda çalışır mı?
Birçok DBMS'de, dış anahtarın kaskadları desteklemesi için benzersiz veya PRIMARY KEY'e referans vermesi gerekir. Aksi takdirde, komut çalışmayacaktır.
Kaskad zinciri izin verilen derinlik sınırlarını aşabilir mi (özyineleme), ve ne olur?
Evet: büyük kaskadlarda derinlik sınırlarının aşılması mümkündür (örneğin, SQL Server'da — 32). Bu, bir hata ve işlemin geri alınması ile sonuçlanır.
Tedarikçi ve sipariş izleme sisteminde ON DELETE CASCADE uygulandı — müşteriler yanlışlıkla önemli bir tedarikçiyi sildi, tüm siparişler otomatik olarak silindi, teslimat geçmişleri kayboldu. Verileri geri yüklemek imkansız hale geldi.
Artılar:
Eksiler:
ON DELETE SET NULL kullandık, artı kaydetme için tetikleyici — müşteri kaydı silinse bile siparişlerin geçmişi saklandı (geçersiz durum verildi), rastgele kütlesel silim gerçekleşmedi.
Artılar:
Eksiler: