On Cascade Sil ve On Cascade Güncelleme arasındaki farkı mysql içinde


45

Ben MySQL veritabanı-iki tablo var parent, child. Üst tabloyu temel alarak alt tabloma yabancı anahtar başvuruları eklemeye çalışıyorum. ON UPDATE CASCADEVe arasında önemli bir fark var mıON DELETE CASCADE

Veli Masam

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

Sorum şu: Aşağıdaki sql sorguları arasındaki fark nedir.

  1. ON DELETE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON DELETE CASCADE
    ) ENGINE=INNODB;
    
  2. ON UPDATE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON UPDATE CASCADE
    ) ENGINE=INNODB;
    
  3. ON UPDATE CASCADE ON DELETE CASCADE

    CREATE TABLE child (
            id INT, 
            parent_id INT,
            INDEX par_ind (parent_id),
            FOREIGN KEY (parent_id) 
                REFERENCES parent(id)
                ON UPDATE CASCADE ON DELETE CASCADE
        ) ENGINE=INNODB;
    

Sorgularda herhangi bir hata var mı? Bu sorgular (1,2 ve 3) ne anlama geliyor? Onlar aynı mı ???


1
Bütünlük için ps <nitpick>, yukarıda bahsettiğiniz şey DDL (Veri Tanım Dili) cümleleridir , sorgular değildir. Bir sorgu genellikle DML (Veri İşleme Dili SEÇ, INSERT, GÜNCELLEME, SİLME) olarak kabul edilir </nitpick>
Vérace

Tamamlanma için yine bir ps daha, varsayılanın ne olduğunu merak ettim. Bu yüzden güncelleme veya silme olmadan bir çocuk yarattım. Öyleyse, bağımlı çocuğu olan bir ebeveyni güncelleyemez veya silemezsiniz. Bu çok mantıklı geliyor, ancak MySQL her zaman bu özel karakteristiğin bir modeli değildir :-)
Vérace

Yanıtlar:


64

Bu konuda çok iyi bir iş parçacığı burada ve burada da bulunacak . MySQL'in kesin rehberi elbette burada bulunacak belgelerdir .

SQL 2003 standardında 5 farklı referans eylemi vardır:

  1. ÇAĞLAYAN
  2. SINIRLAMADIKLARI
  3. HİÇBİR EYLEM
  4. NULL SET
  5. VARSAYILANA AYARLA

Soruyu cevaplamak için:

  1. ÇAĞLAYAN

    • ON DELETE CASCADEAna kayıt silinirse, alt kayıtların da silineceği anlamına gelir. Bu bence iyi bir fikir değil . TRIGGERS kullanılarak yapılabilmesine rağmen, veritabanında bulunan tüm verileri takip etmelisiniz . (Ancak, aşağıdaki açıklamalarda uyarıya bakınız).

    • ON UPDATE CASCADEebeveyn ana anahtar değiştirilirse, çocuk değerinin de bunu yansıtacak şekilde değişeceği anlamına gelir. Yine bence, iyi bir fikir değil. Herhangi PRIMARY KEYbir düzende değişiklik yapıyorsanız (veya hatta!), Tasarımınızla ilgili bir sorun var. Yine, yorumlara bakın.

    • ON UPDATE CASCADE ON DELETE CASCADESiz UPDATE veya DELETE ebeveyni, değişimin çocuğa basamaklandırıldığı anlamına gelir . Bu, ANDilk iki ifadenin sonuçlarının ortaya konmasına eşdeğerdir .

  2. SINIRLAMADIKLARI

    • RESTRICTana öğeyi silme ve / veya güncelleme girişiminin hata atmayacağı anlamına gelir. Bu, bir başvuru işleminin açıkça belirtilmemesi durumunda varsayılan davranıştır.

      Bir İçin ON DELETEveya ON UPDATEo belirtilmemişse, varsayılan eylem daima RESTRICT` olduğunu.

  3. HİÇBİR EYLEM

    • NO ACTION: Kılavuzdan . Standart SQL’den bir anahtar kelime. MySQL'de buna eşdeğerdir RESTRICT. Başvurulan tabloda ilgili bir yabancı anahtar değeri varsa, MySQL Sunucusu ana tablo için silme veya güncelleme işlemini reddeder. Bazı veritabanı sistemlerinin ertelenmiş çekleri vardır ve NO ACTIONertelenmiş çekleridir. MySQL'de yabancı anahtar kısıtlamaları derhal kontrol NO ACTIONedilir, aynı şekilde RESTRICT.
  4. NULL SET

    • SET NULL- tekrar el kitabından. Satırı ana tablodan silin veya güncelleyin ve alt anahtardaki yabancı anahtar sütununu veya sütunlarını olarak ayarlayın NULL. Bu, IMHO fikirlerinin en iyisi değildir, çünkü öncelikle "zaman yolculuğu" yolu yoktur - yani alt tablolara bakmak ve kayıtları NULLilgili üst kayıtla s ile ilişkilendirmek - ya CASCADEda TRIGGERizlemek için kayıt tablolarını doldurmak için s kullanmak değişiklikler (ancak yorumları görün).
  5. VARSAYILANA AYARLA

    • SET DEFAULT. Bir başka (potansiyel olarak çok faydalı) SQL standardının MySQL'in uygulamaya koymadığı bir bölümü! Geliştiricinin, bir GÜNCELLEME veya SİLME üzerindeki yabancı anahtar sütun (ları) ayarlayacağı bir değer belirlemesini sağlar. InnoDB ve NDB tablo tanımlarını bir SET DEFAULTcümle ile reddedecektir .

Yukarıda belirtildiği gibi, burada belgelere bakarak biraz zaman geçirmelisiniz .


8
Tam cevabını beğendim, ancak bu açıklamaya katılmıyorum. "Veritabanında bulunan tüm verileri takip etmelisiniz" - bu gerçekten veritabanının tasarımına ve amaçlarına bağlıdır. Örneğin, bir tarif tanımı silindiğinde (yemek tarifinden bahsetmiyorum - sistem konfigürasyonları gibi) - tarif tanımı silindiğinde, bu tarifin ilişkili çocuklarının saklanması bir anlam ifade etmiyor - bu da db'yi sebepsiz yere şişiriyor. Ayrıca makine sistemleri için çalışma masaları - Artık verilere ihtiyacım yok; işlemek ve ondan kurtulmak. Bunun dışında cevabınız harika.
StixO

2
@StixO ile benzer Bu cevabı çoğunlukla beğeniyorum, ancak birincil anahtarı değiştirme konusunda hemfikirim. Bunun kötü bir fikir olacağı kesin tasarımlar var ama dağıtılmış bir veritabanına girdiğinizde, birincil anahtarların bir kaydın kimliğini kaybetmeden yeniden atanmaları serbest olması çok arzu edilebilir.
Garet Claborn,

“Bu bence iyi bir fikir değil. Veritabanında bulunan tüm verileri takip etmelisin.” - Amacını anladığımdan emin değilim. Eğer 'delete' yazısını kullanıyorsanız, o zaman zaten bir şeyi silmeniz gerektiğine karar verdiniz. Hiçbir şeyi silmemeye karar verirseniz, hiçbir şey artmayacaktır. Yine de sahip olmanın faydası, başvurunuzda yabancı bir kimliğe sahip bir kayıt ararken, orada olacağınızı bildiğinizden ve veritabanınızı şişiren yetim sıralar olmayacağından emin olmanızdır; şey.
Jeff Ryan,

Buradaki mantık yer yer oldukça hatalı, ve yeni GSYİH dünyamızda daha da fazlası. Birincil anahtarlar değişiyorsa, yanlış bir şeyin işareti olabileceği fikrine katılıyorum.
Chuck Le Butt

PRIMARY KEY'leri herhangi bir düzende (veya hatta hiç!) Değiştiriyorsanız, tasarımınızla ilgili bir sorun var. ON UPDATE CASCADE, anahtarın değerini veya anahtarın adını değiştirir mi?
Billal Begueradj

8

Bu ikisi, sırasıyla, üst tablodaki başvurulan kayıt kimliğini değiştirdiğinde ve silindiğinde gerçekleştirilecek eylemlerdir.

Eğer yürütürseniz:

UPDATE parent SET id = -1 WHERE id = 1;

Ve üzerinde en az bir kayıt childvar parent_id = 1, 1) başarısız olacak; 2) ve 3) durumlarında parent_id = 1 olan tüm kayıtlar parent_id = -1 olarak güncellenir.

Eğer yürütürseniz:

DELETE FROM parent WHERE id = 1;

Ve üzerinde en az bir kayıt childvar parent_id = 1, 2) başarısız olacak; 1) ve 3) durumlarında tüm kayıtlar parent_id = 1silinir.

3) sözdizimsel olarak doğru.

Tam dokümantasyon kılavuzunda bulunabilir .


6

Önceki cevaplar hakkında yorum yapacak kadar itibarım yok. Ben de biraz detaylandıracağımı düşündüm.

1) ON DELETE CASCADE, eğer üst kayıt silinirse, referans alan tüm alt kayıtlar da silinir. ON UPDATE varsayılan olarak RESTRICT olarak ayarlanmıştır; bu, üst kayıttaki UPDATE'in başarısız olacağı anlamına gelir.

2) ON DELETE eylemi varsayılan olarak RESTRICT olarak ayarlanmıştır; bu, üst kayıttaki DELETE öğesinin başarısız olacağı anlamına gelir. GÜNCELLEME KASASI, üst kayıt güncellendiğinde tüm referans veren çocuk kayıtlarını günceller.

3) Yukarıdaki 1) ve 2) deki CASCADE işlemlerine bakınız.

Üst kayıt kimliklerini yabancı anahtar olarak kullanmaya ilişkin (alt tablolarda) - deneyimler a) kimlikleri otomatik olarak üretilen sıra numaraları ise, bunları yabancı anahtar olarak KULLANMAYIN. Bunun yerine başka bir benzersiz üst anahtar kullanın. b) Kimlikler GUID ise, bunları yabancı anahtar olarak kullanmak uygun olur. Kayıtları dışa aktarırken veya içe aktarırken veya kayıtları başka bir veritabanına kopyalarken bilgeliği bu öneride görürsünüz. Veri geçişi sırasında yabancı anahtarlar olarak adlandırıldıklarında otomatik olarak oluşturulan dizi numaralarıyla uğraşmak çok zordur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.