Ana içeriğe geç

Yabancı Anahtar

İngilizcesi
Foreign Key
Türkçe karşılığı
dış anahtar
Okunuşu
forın ki

Günlük kullanımda iki ad da yaygın.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/foreign-key

Kısaca

Yabancı anahtar, bir veritabanı tablosunda başka bir tablonun birincil anahtarına başvuran sütundur; ilişkili satırları bağlar ve başvuruları geçerli tutar.

Yabancı anahtar nedir?

Yabancı anahtar, iki tablo arasında bir bağ kurar. Örneğin bir orders tablosunda, değerleri customers tablosundaki bir id ile eşleşmek zorunda olan bir customer_id sütunu olabilir; bu sütun bir yabancı anahtardır ve her siparişi hangi müşterinin verdiğini kaydeder. Yabancı anahtarı barındıran tabloya çoğu zaman alt (child) tablo, işaret ettiği tabloya ise üst (parent) tablo denir.

Veritabanı bu bağı, referans bütünlüğü (referential integrity) adı verilen bir kuralla uygular: var olmayan bir müşteriye işaret eden her ekleme ya da güncellemeyi reddeder ve bir üst satır silindiğinde ne olacağını denetler. ON DELETE RESTRICT ile siparişler hâlâ müşteriye başvuruyorken silme engellenir; ON DELETE CASCADE ile müşterinin siparişleri de silinir; ON DELETE SET NULL ile ise başvuru temizlenir.

Bir kütüphane ödünç alma fişinin üzerindeki kart numarasını düşünün: fiş üyenin adını ve adresini tekrarlamaz, yalnızca üyenin kaydına işaret eder ve kütüphane hiç verilmemiş bir kart numarasını kabul etmez. Yabancı anahtarlar, ilişkisel veritabanlarının bir müşterinin çok sayıda siparişi olması gibi bire-çok ilişkileri ve bir ara tablo (junction table) üzerinden çoktan-çoğa ilişkileri modelleme biçimidir; JOIN sorguları da genellikle bunları izler.

Yabancı anahtar, birincil anahtarla aynı şey değildir. Birincil anahtar kendi tablosundaki bir satırı tanımlar; yabancı anahtar ise başka bir tablonun anahtarını, ona başvurmak için saklar; bu yüzden birincil anahtarın aksine tekrar edebilir ve izin verilirse NULL olabilir. Ayrıca çoğu veritabanının yabancı anahtar sütunlarını otomatik olarak indekslemediğini (MySQL'in InnoDB motoru bir istisnadır), bu yüzden onlara indeks eklemenin genellikle birleştirmeleri ve silmeleri hızlandırdığını unutmayın.

Önemli noktalar

  • Yabancı anahtar, başka bir tablonun birincil anahtarına ya da benzersiz bir sütununa başvurur.
  • Referans bütünlüğünü uygular: başvurular var olan satırlara işaret etmelidir.
  • CASCADE ya da RESTRICT gibi ON DELETE kuralları, bir üst satır kaldırıldığında ne olacağına karar verir.
  • Yabancı anahtar değerleri tekrar edebilir; bire-çok ilişkiler bu şekilde modellenir.
  • Birleştirmeleri ve silmeleri hızlı tutmak için yabancı anahtar sütunlarını indeksleyin.

Örnek

Siparişleri yabancı anahtarla müşterilere bağlamaksql
CREATE TABLE customers (
  id   BIGINT PRIMARY KEY,
  name TEXT NOT NULL
);

-- customer_id must match an existing customers.id
CREATE TABLE orders (
  id          BIGINT PRIMARY KEY,
  customer_id BIGINT NOT NULL REFERENCES customers (id) ON DELETE CASCADE,
  total       NUMERIC(10, 2) NOT NULL
);

-- Fails with a foreign key violation: there is no customer with id 999
INSERT INTO orders (id, customer_id, total) VALUES (1, 999, 25.00);

Sık sorulan sorular

Birincil anahtar ile yabancı anahtar arasındaki fark nedir?

Birincil anahtar, kendi tablosundaki her satırı benzersiz biçimde tanımlar ve tekrar edemez ya da NULL olamaz. Yabancı anahtar ise başka bir tabloda bulunur, satıra başvurmak için o birincil anahtar değerini saklar ve birçok satırda tekrar edebilir.

Yabancı anahtar NULL olabilir mi?

Evet, sütun NOT NULL olarak tanımlanmadıkça. NULL bir yabancı anahtar, satırın hiçbir üst kayda bağlı olmadığı anlamına gelir; örneğin henüz bir satış temsilcisine atanmamış bir sipariş gibi.

ON DELETE CASCADE ne yapar?

Veritabanına, bir alt satırların başvurduğu üst satır silindiğinde onları da otomatik olarak silmesini söyler. Kullanışlıdır ancak güçlüdür; bu yüzden yalnızca alt verinin üst kaydı olmadan anlamı olmadığı yerlerde kullanın.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar