MySQL'de Yabancı Anahtarların Temelleri?


91

MySQL'in yabancı anahtar yapısının nasıl kullanılacağına dair iyi bir açıklama var mı?

MySQL belgelerinden tam olarak anlamıyorum. Şimdiye kadar birleştirmeler ve programlama kodu ile yabancı anahtarlar gibi şeyleri idare ediyordum.

Ve sorunun ikinci kısmı, MySQL'in dahili yabancı anahtarlarını kullanarak yapılacak herhangi bir iyileştirme var mı?

Yanıtlar:


118

FOREIGN KEYS verilerinizin tutarlı olduğundan emin olun.

Verimlilik açısından sorguları iyileştirmezler, sadece bazı yanlış sorguların başarısız olmasına neden olurlar.

Böyle bir ilişkiniz varsa:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, O zaman silemezsiniz departmentbazı varsa employee's.

Eğer sağlarsanız ON DELETE CASCADEiçin FOREIGN KEYtanım, referans satırlar başvurulan olanlarla birlikte otomatik olarak silinir.

Kısıtlama olarak, FOREIGN KEYaslında sorguları biraz yavaşlatır.

Referanslı bir tablodan silinirken veya referans veren bir tabloya eklenirken ekstra kontrol yapılması gerekir.


1
Yavaşlama minimumdur, çünkü genellikle FK'yi indekslenmiş alanlarda yaparsınız, bu da ilgili değerleri bulmayı kolaylaştırır.
Seb

4
Bu yüzden "biraz" yazdım :) Aslında, bir sürü satırı JOIN
siliyorsunuz

2
Olumsuz oy için özür dilerim. Tesadüftü, ama oyumu değiştirmeme izin vermiyor.
Wondercricket

8
@Wondercricket: Şimdi ne yapacağımı bile bilmiyorum, site kurallarında gri alan var. Sanırım Moskova'dayken bana bir bira alıyorsun ve ödeşiyoruz.
Quassnoi

1
@stack: referans tablosuna atıfta bulunulan anahtar basamaklarına yaptığınız herhangi bir güncelleme.
Quassnoi

32

Gerçek yabancı anahtarları kullanmanın temel faydaları, veri bütünlüğünü sağlamak ve bir şey değiştirildiğinde veya silindiğinde ilgili öğeler üzerinde basamaklı eylemler ayarlayabilmektir.

Örneğin, bir forum programladığınızı hayal edin. Birincil anahtara sahip bir "konular" tablonuz topics.topic_idvar posts.topic_idve konular tablosunun yabancı anahtarı olan sütunla konulara gönderilerin eklendiği bir "gönderiler" tablonuz var.

Bu yabancı anahtar ilişkisi, her gönderinin geçerli bir konuya eklenmesini sağlar. Tek konunun kimliği 1 numaralıysa, konu # 2'ye ekli veritabanında bir gönderi olması imkansızdır. Veritabanı bunu sağlar.

Basamaklı avantaj için, konu tablosundan bir konu silinirse, veritabanının bu konuya ekli gönderiler tablosundaki tüm gönderileri otomatik olarak sileceği şekilde ayarlayabilirsiniz. Bu güzel, çünkü elle yapmayı hatırlamanız gereken bir adımı kaldırır, bu, birbirine bağlı birçok tablonuz olduğunda oldukça karmaşık hale gelebilir. Yabancı anahtarlarla tüm ilişkiler otomatik olarak temizlenebilir.


11

1. YABANCI ANAHTARLAR, verilerinizin tutarlı olmasını sağlar.

2. Silme kademesini yabancı anahtar tanımına uygularsak, ana satır silindiğinde referans satırı otomatik olarak silinecektir.

3. Güncelle Basamakla'yı yabancı anahtar tanımına uygularsak, Alt satır, üst satır güncellendiğinde otomatik olarak güncellenir.

Sorgu: ALTER TABLE child ADD YABANCI ANAHTAR (parent_id) REFERENCES parent (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. doğrudan üst tabloyu silemezsiniz, önce yabancı anahtarı alt tablodan silin, üst tabloyu silin.

7
Sonunda yabancı anahtar örnekleriyle ilgili kafamı karıştıran şeyi anladım. Dört çocuk babası olarak, çocuğun ebeveynini takip etmesine alışkın değilim . Bir kırk yıl kadar sonra, bu artık geriye doğru görünmeyebilir.
Bob Stein

1
Örnek tablolarınıza "çocuk" ve "ebeveyn" gibi isimler verdiğiniz için teşekkür ederiz ... aslında oldukça yararlıdır ve keşke resmi belgelerin yapmasını dilerim!
mike rodent

7

Ana avantajı, tabloya girebileceğiniz değerleri sınırlayabilmenizdir; referans verilen tabloda olmayan bir değer girmeye çalışırsanız, bunu yapamazsınız.

Ayrıca, başvurulan tablodaki değeri günceller veya silerseniz, değeri otomatik olarak güncelleyecek veya bu değeri içeren herhangi bir satırı basamaklı olarak silecek şekilde ayarlayabilirsiniz.

Bu gerçekten kodunuzu kullanan harika bir özellik.

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.