Skip to main content

🧩 SQL Foreign Key (Yabancı Anahtar) Kullanımı: Veri Bütünlüğünü Sağlama

🚀 Bu Rehberde Ne Öğreneceksiniz?

Bu rehber, büyük SQL projelerinde veri doğruluğunu korumanın temel aracı olan Foreign Key (Yabancı Anahtar) kullanımını öğretir.
İki tablo arasında ilişki kurarak geçersiz (yetim) kayıtların oluşumunu engellemeyi ve
MySQL üzerinde referans bütünlüğünü (Referential Integrity) sağlamayı adım adım öğreneceksiniz.


🧠 Teknik Özet

Konu: SQL’de Foreign Key (Yabancı Anahtar) ile referans bütünlüğü sağlamak
Amaç: Tablolar arasında veri tutarlılığını zorlamak, hatalı kayıt eklenmesini önlemek
Adımlar:

  1. MySQL’e bağlanma
  2. Örnek veritabanı ve tabloları oluşturma
  3. Foreign Key tanımlama
  4. Geçersiz veri ekleme denemesi
  5. Geçerli veri ekleme
  6. JOIN ile ilişkili sorgu çalıştırma
  7. Ebeveyn kayıt silme testleri

⚙️ 1. Örnek Veritabanı ve Tabloların Kurulumu

MySQL Sunucusuna Bağlanın

sudo mysql -u rabisu_kullanici -p

➡️ MySQL komut satırına kullanıcı hesabınızla giriş yapar.

Veritabanı Oluşturun

CREATE DATABASE sirket_vt;
USE sirket_vt;

➡️ Yeni bir sirket_vt veritabanı oluşturur ve aktif hale getirir.

Pozisyonlar (Ebeveyn) Tablosu

CREATE TABLE pozisyonlar (
pozisyon_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
pozisyon_adi VARCHAR(50)
) ENGINE = InnoDB;

➡️ Tüm geçerli pozisyonları tutacak referans (ebeveyn) tabloyu oluşturur.

Örnek verileri ekleyin:

INSERT INTO pozisyonlar (pozisyon_adi) VALUES ('ŞUBE MÜDÜRÜ'), ('MEMUR'), ('SEVİYE 1 AMİR');

Çalışanlar (Çocuk) Tablosu

CREATE TABLE calisanlar (
calisan_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
pozisyon_id BIGINT NOT NULL,
ad VARCHAR(50),
soyad VARCHAR(50),
telefon VARCHAR(50),
INDEX (pozisyon_id),
FOREIGN KEY (pozisyon_id) REFERENCES pozisyonlar (pozisyon_id)
) ENGINE = InnoDB;

➡️ Her çalışan kaydı, pozisyonlar tablosundaki geçerli bir pozisyona bağlanır.


🚫 2. Geçersiz Veri Girişi (Foreign Key Hatası)

Şu anda geçerli pozisyon_id değerleri 1, 2, 3’tür. Aşağıdaki sorgular, olmayan ID’lerle veri eklemeyi dener:

INSERT INTO calisanlar (pozisyon_id, ad, soyad, telefon) VALUES (4, 'AYŞE', 'YILMAZ', '11111');

❌ Sonuç:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails

➡️ MySQL, geçersiz bir pozisyon_id bulunduğu için kaydı reddeder. Bu sayede veri tutarlılığı korunur.


✅ 3. Geçerli Veri Girişi

INSERT INTO calisanlar (pozisyon_id, ad, soyad, telefon) VALUES
(1, 'CANSU', 'AKIN', '11111'),
(2, 'MUSTAFA', 'DEMİR', '55555'),
(3, 'SELİN', 'UÇAR', '22222');

➡️ Geçerli pozisyon_id değerleriyle kayıt eklenir.


🔗 4. İlişkili Veriyi JOIN ile Görüntüleme

SELECT
c.calisan_id,
c.ad,
c.soyad,
p.pozisyon_adi,
c.telefon
FROM calisanlar c
LEFT JOIN pozisyonlar p
ON c.pozisyon_id = p.pozisyon_id;

📋 Sonuç:

calisan_idadsoyadpozisyon_aditelefon
1CANSUAKINŞUBE MÜDÜRÜ11111
2MUSTAFADEMİRMEMUR55555
3SELİNUÇARSEVİYE 1 AMİR22222

➡️ Her çalışanın pozisyonu doğru şekilde ilişkilendirilmiş olarak listelenir.


🛑 5. Ebeveyn Kaydını Silme Testi

DELETE FROM pozisyonlar WHERE pozisyon_id = 1;

❌ Sonuç:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails

➡️ İlişkili çalışan kaydı olduğu için silme işlemi engellenir.

Yeni bir pozisyon ekleyip silme işlemini deneyin:

INSERT INTO pozisyonlar (pozisyon_adi) VALUES ('CEO');
DELETE FROM pozisyonlar WHERE pozisyon_id = 4;

✅ Başarılı olur çünkü bu pozisyon hiçbir kayda bağlı değildir.


💬 Sıkça Sorulan Sorular (SSS)

  1. Yabancı Anahtarın (Foreign Key) amacı nedir?

İlişkili tablolar arasında referans bütünlüğünü sağlar, hatalı veri girişini engeller.

  1. InnoDB neden gereklidir?

MySQL’de foreign key kısıtlamaları sadece InnoDB motorunda desteklenir.

  1. Performansa etkisi olur mu?

Yazma işlemlerinde küçük bir yük getirir ama sorgularda hız ve güvenlik kazandırır.

  1. Foreign Key kontrolü devre dışı bırakılabilir mi?

Evet, büyük veri aktarımı sırasında geçici olarak kapatılabilir:

SET FOREIGN_KEY_CHECKS = 0;
  1. CASCADE ne işe yarar?

Ebeveyn silindiğinde veya güncellendiğinde çocuk kayıtların da otomatik etkilenmesini sağlar.

  1. Foreign Key tanımlanan sütun otomatik indekslenir mi?

Evet, MySQL bunu otomatik olarak yapar; bu da JOIN performansını artırır.


🧭 Sonuç

Bu rehberde, SQL veritabanlarında Foreign Key kullanarak veri tutarlılığı ve referans bütünlüğü sağlamayı öğrendiniz. Bu yöntem, uygulama seviyesinde ekstra doğrulama yazmadan, veritabanı düzeyinde güvenli veri ilişkileri kurmanızı sağlar.

Projelerinizde veri güvenliği ve yüksek performans için Rabisu Bulut altyapısında SQL veritabanınızı hemen kurup test edebilirsiniz