SORU
16 Temmuz 2011, CUMARTESİ


SİL GÜNCELLEME ve yabancı anahtar kısıtlamaları:

Veritabanı şema diyagramları yapabileceğiniz ve bunları dönüştürür çünkü çok iyi bir MySQL Tezgah, kullanarak :P tasarlıyorum

Neyse, bu Yabancı Anahtar desteği olmadığı için Bunu kullanmaya karar verdim. Ama fark ettiğim bir şey Güncelleştirme ayarlayın ve yabancı anahtarları Sil seçenekleri sunuyor. Birisi nerede açıklayabilir "", "Çağlayan ve boş küme" basit bir örnek olarak kullanılabilir mi? Sınırla

Örneğin, userID içeren user bir tablo var. Ve söyle bir mesaj Tablo message olan bir çok-çok olan 2 yabancı anahtarlar (referans aynı birincil anahtar userID user Tablo). Silmek seçenekleri Güncelleme ve ayar herhangi bir yararlı bu durumda? Eğer öyleyse, hangisini seçeceğim? Eğer bu iyi bir örnek değil ama, iyi bir örnek ile gelip lütfen bu yararlı olabilir nasıl göstermek için olabilir mi?

Teşekkürler

CEVAP
16 Temmuz 2011, CUMARTESİ


Veritabanı üzerinde kısıtlamalar koymak için tereddüt etmeyin. Tutarlı bir veritabanı olduğundan emin olacaksın, ve bir veritabanı kullanmak için iyi bir nedeni de budur. Eğer varsa çeşitli uygulamalar isteyen varsa, özellikle (ya da sadece tek bir uygulama ama doğrudan bir mod ve bir toplu iş modu farklı kaynaklar kullanarak).

MySQL ile postgreSQL olurdu gibi gelişmiş kısıtlamaları gerekmez ama en azından yabancı anahtar kısıtlamaları oldukça gelişmiş.

Örneğin, kullanıcı bir tablo eşliğinde bir masa tezler şirketten insanlar içeren alacağız

CREATE TABLE COMPANY (company_id INT NOT NULL,
     company_name VARCHAR(50),
     PRIMARY KEY (company_id)
) ENGINE=INNODB;;
CREATE TABLE USER (user_id INT, user_name VARCHAR(50), 
     company_id INT,
     INDEX company_id_idx (company_id),
     FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
) ENGINE=INNODB;

Hadi bakalımGÜNCELLEME ÜZERİNDEfıkra:

  • GÜNCELLEME KISITLAMAK:varsayılan: eğer tablo şirketinde company_id güncelleştirmeye çalışırsanız motoru eğer bir KULLANICI en azından bu şirket bağlantıları işlem reddeder.
  • HİÇBİR EYLEM GÜNCELLEŞTİRİN: KISITLAMAK gibi.
  • UPDATE CASCADE:genellikle en iyi: tablo ŞİRKET arka arkaya bir company_id güncelleme varsa motoru ona göre tüm KULLANICI satır bu ŞİRKETE başvuran (ama KULLANICI tablo üzerinde, uyarı aktif tetikleyiciler yok) güncellenir. Motor senin için değişiklikleri iyi takip eder.
  • UPDATE SET NULL: tablo ŞİRKET arka arkaya bir company_id güncelleştirme motoru ile ilgili Kullanıcı NULL (KULLANICI company_id alanında mevcut olmalıdır) company_id koyacaktır. Ben bir güncelleme yapmak için ilginç bir şey görüyor, ama yanılıyor olabilirim.

Ve şimdiSİLyan:

  • SİL KISITLAMAK:varsayılan: eğer tablo ŞİRKET company_id Kimliği silmeye çalışırsanız motoru eğer bir KULLANICI en azından bu şirket bağlantıları, hayatınızı kurtarabilir, operasyon reddeder.
  • SİLME EYLEM YOK: KISITLAMAK gibi
  • ON DELETE CASCADE:tehlikeli: masa ŞİRKETİ şirket bir satır silerseniz, motor ve ilgili Kullanıcıları siler. Bu tehlikeli, ancak ikincil tablolarda otomatik temizlikleri yapmak için kullanılabilir istediğin bir şey, ama oldukça kesinlikle ŞİRKET< için değil yani (; ->KULLANICI örnek)
  • ON DELETE SET NULL: * avuç* : eğer ŞİRKET bir satır silerseniz ilgili Kullanıcılara otomatik olarak BOŞ bir ilişkimiz yok. Eğer Null değeri için kullanıcılar ile hiçbir şirket bunu iyi bir davranış, örneğin belki de ihtiyacın tutmak kullanıcıları uygulama, yazarlar, bazı içerik, ama çıkarmadan şirket sorun olmaz senin için.

genellikle varsayılanUPDATE CASCADE KISITLAMA SİL. bazı ON DELETE CASCADE parça tablolar (günlükleri--tüm-- günlükleri, böyle şeyler) ve ON DELETE SET NULL Ana Tablo 'basit öznitelik' için tablo içeren yabancı anahtar, tablo gibi bir İŞ için KULLANICI tablo.

Edit

O yazdığımdan beri uzun zaman oldu. Şimdi önemli bir uyarı eklemek istiyorum. MySQL cascades ile büyük bir belgelenmiş sınırlama vardır.Cascades ateş tetikler. Eğer yeteri kadar emin olsan bu motoru kullanmak için cascades kısıtlamalar kaçının tetikler.

MySQL değişiklikleri SQL ifadeleri ile tablo için sadece etkinleştirmek için tetikler. Ne tablolar MySQL Sunucusu için SQL ifadeleri ilet bu API tarafından yapılan değişiklikler görünümlerinde değişiklikler için etkinleştirin

Tetikleyiciler yabancı anahtar eylemler tarafından aktive edilir.

Ve bu bir gün içinde tamir olacağını sanmıyorum. Yabancı anahtar kısıtlamaları, Bunu Depolama Birimi tarafından yönetilen ve MySQL SQL motoru tarafından yönetilir Tetikler. Her iki ayrılır. Orada kısıtlama yönetimi ile sadece depolama, belki tetikler doğrudan depolama motoru bir gün, belki eklemek gerekir.

Ama zavallı tetik uygulaması ve çok yararlı yabancı anahtar kısıtlamaları destekler arasında seçmek gereken benim kendi düşüncem var. Ve veritabanı tutarlılık alışacaksın sonra PostgreSQL seveceksiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • IGN

    IGN

    19 EYLÜL 2006
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009
  • UrAvgConsumer

    UrAvgConsume

    1 Ocak 2012