SQL Server’da Yabancı Anahtarları Anlamak

İlişkisel bir veritabanı tasarlarken, veri bütünlüğünü korumak için tablolar arasında ilişkiler kurmak önemlidir. Bunu sağlamanın bir yolu, yabancı anahtarlar kullanmaktır. SQL Server’da bir yabancı anahtar, bir tabloda diğer bir tablonun bir satırını benzersiz olarak tanımlayan bir alandır (veya alanlar dizisidir). PostgreSQL gibi başka bir veritabanı sisteminden geliyorsanız, SQL Server’daki sözdizimi ve uygulamada bazı farklılıklar bulabilirsiniz ki bu da kafa karışıklığına yol açabilir.

Problem: Yabancı Anahtar Oluşturma

Verilen senaryoda, sınavlar, soru_banka ve cevap_banka adında üç tablo oluşturmaya çalışılıyor. Amaç, soru_banka içinde sınavlar tablosunu referans alan bir yabancı anahtar oluşturmaktır. Ancak SQL kodunu çalıştırdığınızda bir hata meydana geliyor. Hata mesajının ana noktası şu şekildedir:

Msg 8139, Level 16, State 0, Line 9 Yabancı anahtardaki referans veren sütun sayısı, referans alınan sütun sayısından farklı; tablo ‘soru_banka’.

Bu, yabancı anahtar tanımında bir uyumsuzluk olduğunu gösterir.

Çözüm: Yabancı Anahtarı Doğru Tanımlama

Adım 1: Tablo Tanımlarını Gözden Geçirme

soru_banka tablosunda yabancı anahtarı doğru bir şekilde ayarlamak için daha yakından bakalım.

Mevcut Tablo Yapısı

Orijinal SQL, soru_banka tablosunu şu şekilde oluşturmuştu:

create table soru_banka
(
    soru_id uniqueidentifier primary key,
    soru_sınav_id uniqueidentifier not null,
    soru_metin varchar(1024) not null,
    soru_puan_değeri decimal,
    constraint soru_sınav_id foreign key references sınavlar(sınav_id)
);

Yabancı anahtar, sınavlar tablosundan sınav_id‘yi referans almak için tasarlanmıştır, ancak uygun sözdizimi ve yapısı eksiktir.

Adım 2: Yabancı Anahtar Tanımını Güncelleme

Yabancı anahtar ilişkisini doğru bir şekilde tanımlamak için, yabancı anahtar sütununun (soru_sınav_id), referans alınan tablonun (sınav_id) birincil anahtarı ile nasıl ilişkili olduğunu belirtin:

create table soru_banka
(
    soru_id uniqueidentifier primary key,
    soru_sınav_id uniqueidentifier not null,
    soru_metin varchar(1024) not null,
    soru_puan_değeri decimal,
    constraint fk_sorubanka_sınavlar foreign key (soru_sınav_id) references sınavlar (sınav_id)
);

Ana Değişiklikler:

  • Yabancı anahtar ismini belirtin: Yabancı anahtar kısıtlamasına (örn. fk_sorubanka_sınavlar) açık olmak için bir isim vermek iyi bir uygulamadır.
  • Yabancı anahtar sütununu doğru bir şekilde referans alın: Yabancı anahtarın, referans alınan tablodaki doğru sütunu referans aldığından emin olun.

Adım 3: Değişiklikleri Uygulama

Artık mevcut soru_banka tablosunu (varsa) silebilir ve düzeltmiş olduğunuz yabancı anahtar tanımı ile yeniden oluşturabilirsiniz:

drop table if exists soru_banka;

create table soru_banka
(
    soru_id uniqueidentifier primary key,
    soru_sınav_id uniqueidentifier not null,
    soru_metin varchar(1024) not null,
    soru_puan_değeri decimal,
    constraint fk_sorubanka_sınavlar foreign key (soru_sınav_id) references sınavlar (sınav_id)
);

Sonuç

SQL Server’da yabancı anahtarların kurulması, veri bütünlüğünü sağlamak ve tablolar arasında ilişkiler kurmak için kritik bir adımdır. Yabancı anahtar kısıtlamalarını dikkatlice tanımlayarak ve herhangi bir sözdizimi sorununu düzelterek, sağlam ve verimli bir veritabanı tasarımı oluşturabilirsiniz.

Herhangi bir hata ile karşılaşmamanız durumunda, her zaman yabancı anahtar tanımlarını kontrol edin ve referans veren sütunun doğru bir şekilde referans alınan sütun ile eşleştiğinden emin olun. Bu kılavuzla birlikte, SQL Server veritabanlarınızda yabancı anahtarları başarıyla uygulamak için iyi bir şekilde donanmış olmalısınız.