Ana içeriğe geç

SQL ON DELETE CASCADE: Bağımlı Verileri Otomatik Olarak Kaldırın

SQL’de ON DELETE CASCADE’in bağımlı silmeleri nasıl otomatikleştirdiğini, tabloları tutarlı tuttuğunu ve yanlışlıkla veri kaybını önlemeye nasıl yardımcı olduğunu anlayın.
· 9 dk. oku

Yapay Zeka ile Keşfedin

SQL’de veri silmek yalnızca tek bir satırı kaldırmaktan ibaret değildir. İlişkisel bir veritabanında tablolar genellikle birbirine bağlıdır ve bir tablodaki silme işlemi diğer tabloları etkileyebilir. Bunu güvenli bir şekilde yönetmek için SQL, satırlar silindiğinde veya güncellendiğinde ilişkili verilerin nasıl davranması gerektiğini tanımlamak üzere yabancı anahtar kısıtlamalarını kullanır.

En güçlü silme seçeneklerinden biri SQL ON DELETE CASCADE kısıtlamasıdır. Bir silmeyi engellemek veya arkada yetim kayıtlar bırakmak yerine, bu kural başvurulan üst satır silindiğinde veritabanına tüm bağımlı alt satırları otomatik olarak kaldırmasını söyler.

Bu eğitimde, ON DELETE CASCADE kısıtlamasının nasıl çalıştığını, veritabanlarının neden otomatik basamaklı silmeleri desteklediğini ve ON DELETE RESTRICT gibi daha kısıtlayıcı kurallara kıyasla ne zaman doğru tercih olduğunu göstereceğim.  SQL’e yeniyseniz, Introduction to SQL kursumuzla başlayın; biraz deneyiminiz varsa Intermediate SQL kursunu deneyin. 

SQL’de ON DELETE CASCADE Nedir?

ON DELETE CASCADE yabancı anahtar kısıtlamasının nasıl çalıştığını anlamak için önce başvuru bütünlüğünü ve CASCADE ifadesini açıklayayım.

Başvuru bütünlüğü ve yabancı anahtarlar

İlişkisel veritabanlarında tablolar, bir tablodaki (çocuk) bir sütunu başka bir tablodaki (ebeveyn) bir birincil anahtara bağlayan yabancı anahtarlar aracılığıyla birbirine bağlanır. Yabancı anahtarlar, bir alt satırın her zaman geçerli bir üst satırı işaret etmesini sağlamak için başvuru bütünlüğünü zorunlu kılar. 

Bu zorunluluk olmadan, veritabanları artık var olmayan verileri referanslayan satırların bulunduğu yetim kayıtlarla kolayca sonuçlanabilir. Bu nedenle, daha oluşmadan önce bu yetimlerle nasıl başa çıkılacağını veritabanına tam olarak söyleyen silme kuralları vardır.

CASCADE gerçekte ne anlama gelir

SQL’de ON DELETE CASCADE kısıtlaması, silinen üst satırı referanslayan tüm alt satırların veritabanı tarafından otomatik olarak silinmesini sağlar. İşlemi yabancı anahtar zincirleri boyunca yinelemeli olarak tetikler ve bağımlı verileri tek bir atomik işlem içinde siler.

Örneğin, veritabanından bir müşteri kaydını silebilir ve bu işlem, bir sorguda hem siparişlerini hem de buna bağlı olarak sipariş kalemlerini silmeye kadar basamaklanır.

ON DELETE CASCADE Pratikte Nasıl Çalışır

Artık CASCADE’in ne yaptığını anladığınıza göre, veritabanının bu mantığı nasıl uyguladığına bakalım.

Ebeveyn ve çocuk tablo ilişkileri

Artık bildiğiniz gibi, veritabanı ilişkilerinde tablolardan biri ebeveyn olarak görev yapar, birincil anahtarı tutar, diğeri ise çocuk olarak görev yapar ve bu anahtarı yabancı anahtar olarak saklar. Ebeveyn tabloda bir DELETE ifadesi çalıştırdığınızda, veritabanı motoru önce yabancı anahtar kısıtlamalarını kontrol eder ve tüm bağımlıları belirlemek için indekslemeyi hız için kullanır.

Bir ebeveyn satır silindiğinde ne olur

Bir üst satırda DELETE komutu çalıştırdığınızda, veritabanı nihai yürütmeyi duraklatır ve yabancı anahtar kurallarını aşağıdaki sırayla kontrol eder:

  • Tanımlama: Motor, silinen kimlikle eşleşen çocuk tablolardaki tüm satırları bulmak için yabancı anahtar indeksine bakar.
  • Yürütme: Üst satırın kaldırılmasından önce (veya sırasında) motor tanımlanan alt satırları siler.
  • Doğrulama: Veritabanı, geride yetim satır kalmadığından emin olur. Tüm silmeler başarılıysa işlem tamamlanır.

Yukarıdaki sürecin yalnızca, makalenin ilerleyen kısımlarında göreceğimiz üzere, ON DELETE CASCADE kısıtlamasını tanımladıysanız gerçekleşeceğini unutmayın.

ON DELETE CASCADE ve Diğer Silme Kuralları

SQL’de, veritabanına farklı tablolardaki ilişkili verilerin nasıl ele alınacağını söyleyen farklı DELETE kuralları vardır. Bu bölümde, ON DELETE CASCADE’i bu kısıtlamalarla karşılaştıracağız.

CASCADE ve RESTRICT

Yukarıdaki açıklamadan gördüğümüz üzere CASCADE, bir üst satır kaldırıldığında tüm bağımlı alt satırları otomatik olarak siler ve geride yetim kayıt kalmamasını sağlar.

Buna karşılık SQL RESTRICT kısıtlaması, herhangi bir alt satır hâlâ üst satırı referans ediyorsa silme işlemini tamamen engeller. Bu işlem yanlışlıkla veri kaybını önler. Aşağıdaki örnekte, RESTRICT kısıtlaması, bir müşteriyi referans eden siparişler varsa müşterinin silinmesini önler.

-- Parent table
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100)
);

-- Child table with ON DELETE RESTRICT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE RESTRICT
);

CASCADE ile SET NULL ve SET DEFAULT

CASCADE bağımlı satırları tamamen kaldırırken, SET NULL ve SET DEFAULT alt satırları aşağıdaki şekillerde korur:

Kısıtlamanızı ON DELETE SET NULL olarak tanımladığınızda, üst satır silinir, ancak alt tablodaki yabancı anahtar değerleri NULL olarak ayarlanır.

Aşağıdaki örnekte, bir müşterinin silinmesi ilişkili siparişleri kaldırmaz. Bunun yerine, orders tablosundaki customer_id sütunu otomatik olarak NULL yapılır. Bu, sipariş kayıtlarını korurken silinen müşteriyle olan ilişkiyi koparır.

-- Child table using ON DELETE SET NULL
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT NULL,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE SET NULL
);

Benzer şekilde, SET DEFAULT seçeneğinde, bir müşterinin silinmesi ilgili siparişleri kaldırmaz. Bunun yerine, orders tablosundaki customer_id tanımlı varsayılan değerine sıfırlanır. Bu, sipariş kayıtlarını korurken onlara önceden tanımlı bir yer tutucu atar.

-- Child table using ON DELETE SET DEFAULT
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT DEFAULT 0,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (customer_id)
        REFERENCES customers(customer_id)
        ON DELETE SET DEFAULT
);

ON DELETE CASCADE ile Yabancı Anahtar Oluşturma

SQL’de ON DELETE RESTRICT kısıtlamasını kullanmak için, üst ve alt tablolar arasında yabancı anahtar ilişkisini kurarken bunu belirtmeniz gerekir.

Tablo şemalarında CASCADE

SQL’de ON DELETE CASCADE kuralını ya tabloları oluştururken ya da mevcut tabloları değiştirerek tanımlayabilirsiniz.

Aşağıdaki örnek, yeni bir tablo tanımlarken SQL ON DELETE CASCADE yabancı anahtar kısıtlamasının nasıl uygulanacağını gösterir. CASCADE ile, bir departmanı silmek o departmanla ilişkili tüm çalışanları otomatik olarak kaldırır.

-- Stores department details
CREATE TABLE departments (
    department_id INT PRIMARY KEY, 
    department_name VARCHAR(100)
);

-- Automatically deletes employees when their department is deleted
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,      -- Unique employee identifier
    department_id INT, 
    CONSTRAINT fk_employees_departments
        FOREIGN KEY (department_id)
        REFERENCES departments(department_id)
        ON DELETE CASCADE
);

Tablo zaten varsa, ON DELETE CASCADE ile bir yabancı anahtar kısıtlaması ekleyebilirsiniz. Böylece bir departmanı silerseniz, ilişkili tüm çalışan kayıtları otomatik olarak silinir.

-- Adds a foreign key constraint after the table already exists
ALTER TABLE employees
ADD CONSTRAINT fk_employees_departments
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE CASCADE;    -- Deletes employees when the related department is deleted

Basamaklı zincirler ve çok seviyeli silmeler

CASCADE’in güçlü özelliklerinden biri, silmelerin tek bir ilişkiyle sınırlı kalmamasıdır. Bir alt tablo aynı zamanda başka bir tablonun üstü ise, silme işlemi birden fazla seviyeye yayılabilir; buna basamaklı zincirler denir. Örneğin, bir kullanıcının silinmesi siparişleri silebilir, bu da sipariş kalemlerini ve onların da ilişkili denetim (audit) satırlarını silebilir.

Bu nedenle, CASCADE kullanan şemaları belgelemek ve dikkatle gözden geçirmek önemlidir. Tek bir silme ifadesi birçok tabloyu etkileyebileceğinden, basamaklı davranışı etkinleştirmeden önce tam bağımlılık zincirini anlamalısınız.

ON DELETE CASCADE için Yaygın Kullanım Senaryoları

ON DELETE CASCADE kısıtlaması, alt tablodaki verilerin üst kaydı olmadan bir değeri olmadığı senaryolarda önemlidir. Gerçek dünyadaki veritabanı yönetiminde nasıl uygulandığına bakalım.

Bağımlı verileri otomatik temizleme

ON DELETE CASCADE’i, manuel temizliğin verimsiz olacağı verileri temizlemek için kullanabilirsiniz. Buna, çoğu zaman yalnızca bir üst kaydı desteklemek için var olan günlükler, geçmiş kayıtları, denetim izleri veya çoktan çoğa birleştirme tabloları gibi tablolar dahildir. Örneğin:

  • Bir kullanıcının silinmesi, oturum açma geçmişinin kaldırılmasını sağlamalıdır
  • Bir siparişin silinmesi, sipariş kalemlerinin kaldırılmasını sağlamalıdır
  • Bir ürünün silinmesi, ürün-kategori eşleme tablosundaki girişleri kaldırmalıdır

Veri yaşam döngüsü yönetimini basitleştirme

CASCADE’i veri yaşam döngüsü kurallarını veritabanına taşımak için de kullanabilirsiniz. İlişkili kayıtları bulmak, doğru sırayla silmek ve kenar durumları ile hataları uygulama koduyla ele almak yerine, veritabanı bu kuralları tutarlı ve atomik bir şekilde uygular.

Bu sayede, bir silme işlemi bir uygulama, bir betik veya bir yönetici sorgusu aracılığıyla tetiklense de CASCADE sonuçların her zaman tutarlı olmasını sağlar.

ON DELETE CASCADE’in Riskleri ve Tuzakları

ON DELETE CASCADE kısıtlaması kullanışlı olsa da yanlış kullanıldığında riskli olabilir. Yaygın tuzakları anlamak, etkili CASCADE kısıtlamaları tasarlamak açısından önemlidir.

İstenmeden yapılan toplu silmeler

CASCADE ile en yaygın risk, istenmeyen geniş çaplı silmelerdir. Ebeveyn tabloda tek bir DELETE ifadesi, birden çok tabloda yüzlerce hatta binlerce ilişkili satırı sessizce kaldırabilir. Bu durum, tablolar arasındaki ilişkiyi doğru anlamadıysanız geri almakta zorlanabileceğiniz beklenmedik veri kayıplarına yol açabilir. 

En iyi uygulama olarak, ebeveyn ve çocuk tablolardaki yabancı anahtarlar arasındaki ilişkiyi izleyebildiğinizden her zaman emin olun. Şemayı doğru kurarsanız, tek bir silmenin hangi tabloları etkileyeceğini bilirsiniz.

Karmaşık şemalardaki gizli bağımlılıklar

Veritabanları büyüdükçe, tablolar ek yabancı anahtarlar biriktirir ve dokümantasyon gerçeklikle uyumsuz hale gelebilir. Zorluk, CASCADE bu tür ortamlarda uygulandığında ortaya çıkar; silmeler, geliştiricilerin veya yöneticilerin farkında olmadığı derin iç içe bağımlılık zincirleri boyunca yayılabilir.

Deneyimlerime dayanarak, CASCADE’i net şema dokümantasyonu ve yabancı anahtar ilişkilerinin düzenli gözden geçirilmesiyle eşleştirmenizi öneririm.

Düzenli olarak veritabanı tasarlıyor veya bakımını yapıyorsanız, SQL Server for Database Administrators yetkinlik yolumuzu denemenizi tavsiye ederim. 

Veritabanına Özgü Notlar ve Davranış

ON DELETE CASCADE kavramı ilişkisel veritabanları genelinde standart olmakla birlikte, her motor temeldeki yürütmeyi küçük farklılıklarla ele alır.

PostgreSQL, MySQL ve SQL Server davranışı

PostgreSQL, MySQL ve SQL Server hepsi ON DELETE CASCADE’i destekler ve aşağıdaki istisnalarla benzer şekilde uygular:

  • MySQL: CASCADE InnoDB ile iyi çalışır, ancak döngüsel basamaklardan kaçınır

  • PostgreSQL: Basamaklı silme zincirlerinde en esnek ve izin verici

  • SQL Server: Birden çok basamak yolu kuralları nedeniyle daha güvenli ancak daha kısıtlayıcı

İşlem kapsamı ve geri alma güvenliği

Basamaklı silmeler, orijinal silme ifadesiyle aynı işlem içinde yürütülür. Veritabanı bir alt satırı silmeye çalışırken bir hatayla karşılaşırsa, tüm işlem başarısız olur. Üst satır silinmez ve halihazırda kaldırılmış alt satırlar geri yüklenir.

Bu işlemsel davranış önemli bir güvenlik ağı sağlar. Onaylamadan önce basamaklı silmeleri test etmenize, gözden geçirmenize veya geri almanıza olanak tanır.

Doğru ON DELETE Stratejisini Seçmek

Artık doğru silme stratejisinin seçiminin verilerinizin nasıl ilişkili olduğuna ve zaman içinde nasıl davranmasını istediğinize bağlı olduğunu biliyorsunuz. Şemanız için doğru DELETE seçimini yapmak üzere aşağıdaki yönergeleri dikkate alın.

CASCADE ne zaman doğru seçimdir

Alt veriler anlamı veya varlığı açısından tamamen üst veriye bağımlı olduğunda ON DELETE CASCADE kısıtlamasını kullanmalısınız. Örneğin şunlarda kullanabilirsiniz:

  • Çoktan çoğa ilişkilerde birleştirme tabloları
  • Günlükler veya geçmiş girdileri gibi geçici veya türetilmiş veriler

Yukarıdaki durumlarda, otomatik temizlik tutarlılık sağlar ve uygulama katmanında gereken manuel silme mantığını azaltır.

Şunları öneririm: Joining Data in SQL kursumuzu alın; burada SQL’deki farklı birleştirme türlerini ve veritabanındaki farklı ilişkili tablolarla nasıl çalışılacağını öğrenirsiniz.

CASCADE’den ne zaman kaçınılmalı

Bununla birlikte, alt verilerin bağımsız bir değeri varsa veya yasal, denetim ya da analitik amaçlarla korunması gerekiyorsa şemanızda ON DELETE CASCADE kısıtlamasından kaçınmalısınız. Örneğin, şu durumlarda CASCADE kullanmayabilirsiniz:

  • Finansal kayıtlar ve faturalar
  • Sağlık verileri gibi denetim günlükleri ve uyumluluk verileri.

Bu gibi durumlarda, daha fazla kontrol ve görünürlük sağlamak için RESTRICT, SET NULL gibi kısıtlayıcı kuralları veya uygulama tarafından yönetilen silmeleri kullanmanızı öneririm.

Sonuç

SQL ON DELETE CASCADE kısıtlaması, üst satır silindiğinde bağımlı verileri otomatik olarak kaldırarak başvuru bütünlüğünü koruyan güçlü bir otomasyon aracıdır. Uygun şekilde kullanıldığında, temizliği basitleştirir, manuel silme mantığını azaltır ve uygulamalarla betikler arasında tutarlı davranış sağlar. İstenmeyen silmeleri önlemek için, veritabanı şemasındaki ilişkileri tam olarak anlamıyorsanız CASCADE kullanırken her zaman dikkatli olun.

İhtiyaçlarınıza uygun veritabanlarını nasıl oluşturup yöneteceğinizi ve uygun VTYS’yi nasıl seçeceğinizi öğrenmek için Database Design kursumuzu almanızı öneririm. Ayrıca, veri mühendisliği ve veri ambarı temellerini öğrenmek için Associate Data Engineer in SQL kariyer yolumuzu denemenizi tavsiye ederim.  

Allan Ouko

Yazar

Allan Ouko

Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.

SQL ON DELETE CASCADE SSS

ON DELETE CASCADE önce alt satırları mı yoksa üst satırları mı siler?

ON DELETE CASCADE, başvuru bütünlüğünü korumak için önce alt satırları siler.

ON DELETE CASCADE, RESTRICT’ten nasıl farklıdır?

CASCADE bağımlı satırları otomatik olarak siler, RESTRICT ise alt satırlar varsa silmeyi engeller.

ON DELETE CASCADE ile SET NULL arasındaki fark nedir?

CASCADE alt satırları kaldırır; SET NULL onları tutar ama yabancı anahtar referansını temizler.

ON DELETE CASCADE geri alınabilir mi?

Evet, basamaklı silmeler bir işlem içinde gerçekleşir ve commit öncesinde geri alabilirsiniz.

SQL’de ON DELETE CASCADE varsayılan davranış mıdır?

Hayır, ON DELETE CASCADE’i varsayılan olarak gelmez; tablo oluştururken veya mevcut bir tabloda yabancı anahtar kısıtlamasında açıkça tanımlamanız gerekir.

Konular

İlgili