- Konu sahibi
- #1
MySQL’de
Bu rehber ve örnek InnoDB tabloları içindir. Cascade, tek başına çalışan bir komut değildir;
Örneğin
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:
Ö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.
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, 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
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 |
|---|---|---|
| CASCADE | Bağlı alt kayıtları otomatik siler veya günceller | Alt kayıt yalnızca üst kayda aitse |
| RESTRICT / NO ACTION | Bağlı kayıt varken üst kaydı değiştirmeyi reddeder | Silme işlemini uygulama kararıyla kontrol etmek istiyorsanız |
| SET NULL | Alt tablodaki foreign key değerini NULL yapar | Alt 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.
- Ö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ş'); - Ü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; - Beklenen sonuçta sipariş satırının
customer_iddeğeri10olur. Bu,ON UPDATE CASCADEdavranışının çalıştığını gösterir. - Şimdi üst kaydı silin:
Kod:DELETE FROM cascade_demo_customers WHERE id = 10; SELECT * FROM cascade_demo_orders; ROLLBACK; - 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 CASCADEyerine 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.