Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
MySQL’de CASCADE, bir tablodaki üst kayıt üzerinde yapılan değişikliğin, ona yabancı anahtarla bağlı alt tablolara otomatik uygulanmasını sağlayan foreign key davranışıdır. En yaygın kullanımı ON DELETE CASCADE ile müşteri silindiğinde müşteriye ait siparişlerin de silinmesi ve ON UPDATE CASCADE ile üst tablonun anahtar değeri değiştiğinde alt tablodaki foreign key değerinin güncellenmesidir.

Bu rehber ve örnek InnoDB tabloları içindir. Cascade, tek başına çalışan bir komut değildir; FOREIGN KEY tanımının parçası olarak yazılır. İlişkinin çalışması için tabloların foreign key destekleyen bir depolama motoru kullanması ve alt tablodaki değerlerin üst tablodaki kayda bağlanması gerekir.

DELETE ve UPDATE davranışları​


ON DELETE CASCADE kullanıldığında üst tablodaki kayıt silinirse, o kayda bağlı alt tablo kayıtları da otomatik silinir. ON UPDATE CASCADE ise üst tablonun referans verilen anahtar değeri değiştiğinde alt tablodaki karşılık gelen değerleri günceller.

Örneğin customers üst tablo, orders alt tablo olsun:

customers.id müşteriyi, orders.customer_id ise siparişin hangi müşteriye ait olduğunu gösterir. Müşteri silindiğinde siparişlerinin de artık anlamlı bir sahibi kalmayacaksa ON DELETE CASCADE uygun olabilir. Ancak müşteri silinse bile siparişlerin geçmiş kayıt olarak korunması gerekiyorsa cascade kullanılmamalıdır.

Referans davranışını seçme​


Cascade kararını, üst kayıt silindiğinde veya anahtar değeri değiştiğinde alt kayıtların ne olması gerektiğine göre verin:

DavranışSonuçUygun olduğu durum
CASCADEBağlı alt kayıtları otomatik siler veya güncellerAlt kayıt yalnızca üst kayda aitse
RESTRICT / NO ACTIONBağlı kayıt varken üst kaydı değiştirmeyi reddederSilme işlemini uygulama kararıyla kontrol etmek istiyorsanız
SET NULLAlt tablodaki foreign key değerini NULL yaparAlt kayıt üst kayıttan bağımsız yaşayabiliyorsa

SET NULL seçeneğinde ilgili alt tablo sütunu NULL kabul etmelidir. NOT NULL bir sütunda bu davranış uygulanamaz.

Çalışan örnek​


Örneği yalnız size ait ayrı deneme veritabanında, bu tablo adları henüz yokken uygulayın. Tablolar oluşturulur; sonra DML denemesi transaction içinde güncelleme ve silmeyi gösterir. Son ROLLBACK veri değişikliklerini geri alır; CREATE TABLE gibi DDL bu kapsamda değildir.

  1. Önce demo tablolarını ve foreign key ilişkisini oluşturun:
    Kod:
    CREATE TABLE cascade_demo_customers (
        id INT PRIMARY KEY,
        name VARCHAR(100) NOT NULL
    ) ENGINE=InnoDB;
    
    CREATE TABLE cascade_demo_orders (
        id INT PRIMARY KEY,
        customer_id INT NOT NULL,
        description VARCHAR(200) NOT NULL,
        CONSTRAINT fk_demo_order_customer
            FOREIGN KEY (customer_id)
            REFERENCES cascade_demo_customers (id)
            ON UPDATE CASCADE
            ON DELETE CASCADE
    ) ENGINE=InnoDB;
    
    INSERT INTO cascade_demo_customers (id, name)
    VALUES (1, 'Ayşe');
    
    INSERT INTO cascade_demo_orders (id, customer_id, description)
    VALUES (101, 1, 'İlk sipariş');
  2. Üst tablonun anahtarını değiştirin:
    SQL:
    START TRANSACTION;
    
    UPDATE cascade_demo_customers
    SET id = 10
    WHERE id = 1;
    
    SELECT id, customer_id, description
    FROM cascade_demo_orders;
  3. Beklenen sonuçta sipariş satırının customer_id değeri 10 olur. Bu, ON UPDATE CASCADE davranışının çalıştığını gösterir.
  4. Şimdi üst kaydı silin:
    Kod:
    DELETE FROM cascade_demo_customers
    WHERE id = 10;
    
    SELECT *
    FROM cascade_demo_orders;
    
    ROLLBACK;
  5. Silmeden sonraki SELECT satır döndürmez; sipariş de silinmiştir. Son ROLLBACK sonrasında örnek müşteri ve sipariş başlangıç değerlerine döner. Bu davranış istenmiyorsa foreign key tanımındaki ON DELETE CASCADE yerine ihtiyaca uygun başka bir referans davranışı seçin.

Sorgu hata veriyorsa önce foreign key sütununun ve referans verilen sütunun veri türlerinin uyumlu olduğunu, tabloların foreign key destekleyen bir motor kullandığını ve alt kaydın gerçekten mevcut bir üst kayda işaret ettiğini kontrol edin. Cascade yalnızca tanımlı foreign key ilişkisi üzerinden çalışır; aynı isimdeki veya uygulama koduyla ilişkili sütunları kendiliğinden takip etmez.

Cascade kullanırken önemli sınır​


Cascade, yanlışlıkla yapılan bir üst kayıt silme işlemini alt kayıtlar boyunca büyütebilir. Bu nedenle sahiplik ilişkisi kesin olan verilerde kullanın. Sipariş, fatura veya denetim kaydı gibi geçmişi korunması gereken verilerde silme yerine pasifleştirme ya da RESTRICT yaklaşımı daha uygun olabilir. Özellikle toplu DELETE sorgularını çalıştırmadan önce aynı koşulla bir SELECT yaparak etkilenecek üst kayıtları kontrol edin.

Sık sorulan sorular​

Cascade ile silinen kayıtlar geri alınabilir mi?​

InnoDB’de işlem açık transaction içindeyse ve commit edilmediyse veri değişiklikleri rollback ile geri alınabilir. Autocommit ile tamamlanan silmeyi sonradan ROLLBACK geri getirmez. DDL aynı güvenceye dahil değildir; örnekte tablo oluşturma transaction öncesindedir.

Alt tablonun DELETE trigger’ı cascade sırasında çalışır mı?​

MySQL’de foreign key cascade işlemleri trigger’ları etkinleştirmez. Alt kaydın silinmesini yalnız onun DELETE trigger’ı üzerinden günlüklemeye güvenmeyin. Denetim ihtiyacını bu sınıra göre tasarlayın; doğrudan DELETE ile foreign key’in otomatik silmesi bu açıdan aynı değildir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic