İlişkisel veritabanı yönetim sistemlerinde (RDBMS), verilerin tutarlılığı ve birbirleriyle olan bağları rastgele değil, belirli kurallar çerçevesinde yürütülür. Bu kuralların en temel yapı taşları Primary Key (Birincil Anahtar) ve Foreign Key (Yabancı Anahtar) kavramlarıdır.
Primary Key bir tablodaki her satırı (record) diğerlerinden ayıran, benzersiz (unique) olan ve NULL değer içeremeyen sütun veya sütun gruplarıdır.
İnce Detaylar:
- Benzersizlik: Aynı değerden iki tane olamaz (Örn: T.C. Kimlik No veya Personel ID).
- Zorunluluk: NOT NULL olmak zorundadır. Boş bırakılamaz.
- Teklik: Bir tabloda sadece bir adet Primary Key tanımlanabilir.
- Composite Key: Eğer tek bir sütun satırı tanımlamaya yetmiyorsa, birden fazla sütun birleşerek bir Primary Key oluşturabilir.
Foreign Key bir tablodaki verileri, başka bir tablodaki verilerle ilişkilendirmek için kullanılan sütundur. Foreign Key, aslında başka bir tablonun Primary Key’ine işaret eder.
İnce Detaylar:
- Referans Bütünlüğü: Foreign Key, bağlı olduğu ana tabloda (Parent) karşılığı olmayan bir değerin alt tabloya (Child) girilmesini engeller.
- Çoklu Tanımlama: Bir tabloda birden fazla Foreign Key bulunabilir.
- NULL Değerler: Primary Key’in aksine, bir Foreign Key sütunu (eğer aksine bir kısıtlama yoksa) NULL değer alabilir.
- İlişki Kurma: Bu iki anahtar birbirine bağlandığında “İlişkisel Veritabanı” yapısı oluşur. Ancak bir sütunun PK veya FK olması için mutlaka birbirlerine bağlı olmaları gerekmez; kendi başlarına da bu rollerde tanımlanabilirler. Fakat anlamlı bir veri yapısı için FK her zaman bir PK’yı hedeflemelidir.
SQL Server’da bir tabloya Primary Key tanımladığınız anda, sistem otomatik olarak o sütun üzerinde bir Clustered Index oluşturur (Eğer tabloda önceden başka bir Clustered Index tanımlanmamışsa).
- Bu, verilerin fiziksel olarak disk üzerinde bu anahtara göre sıralanacağı anlamına gelir.
- Sorguların (özellikle ID bazlı aramaların) inanılmaz hızlı çalışmasını sağlar.
Foreign Key tanımlandığında otomatik olarak bir indeks oluşmaz. Bu, en çok karıştırılan ve performans hatalarına yol açan detaydır.
- FK tanımlandığında SQL Server sadece veri tutarlılığını (Constraint) kontrol eder.
- Ancak, JOIN işlemlerinde veya ana tablodan veri silindiğinde alt tabloda arama yapılacağı için, Foreign Key sütunlarına manuel olarak Non-Clustered Index atılması şiddetle önerilir.
İlişki kurulduğunda (Foreign Key tanımlandığında), ana tablodaki bir veriyi silmek veya güncellemek istediğinizde ne olacağını belirleyen kurallar vardır. Bunun için sayfada bulunan constraint makalesi okunabilir.
- No Action (Varsayılan): Ana tabloda silinmek istenen kayıt, alt tabloda bir FK tarafından kullanılıyorsa silme işlemine izin vermez (Hata döndürür).
- Cascade: Ana tablodaki kayıt silinirse, ona bağlı olan tüm alt tablodaki kayıtlar da otomatik olarak silinir.
- Set Null: Ana tablodaki kayıt silinirse, alt tablodaki karşılığı olan hücreler NULL yapılır.
- Set Default: Ana tablodaki kayıt silinirse, alt tablodaki hücreler varsayılan değere döner.
Özetle
| Özellik | Primary Key (PK) | Foreign Key (FK) |
| Amaç | Satırı benzersiz şekilde tanımlar. | Tablolar arası ilişki kurar. |
| NULL Değer | Kesinlikle izin verilmez. | İzin verilebilir. |
| Tablo Başına Sayı | Sadece 1 adet. | Birden fazla olabilir. |
| Otomatik İndeks | Evet (Clustered Index). | Hayır (Manuel oluşturulmalı). |
| Veri Tekrarı | Tekrar edemez (Unique). | Tekrar edebilir (Many-to-One). |
Bu yapılar sadece verileri birbirine bağlamakla kalmaz, aynı zamanda yanlış veri girişini engelleyerek veritabanınızın “çöp” yığınına dönüşmesini önleyen en temel güvenlik mekanizmasıdır.
select distinct schema_name(fk_tab.schema_id) + '.' + fk_tab.name as foreign_table,st2.row_count as[FK_Satır Sayısı],
schema_name(pk_tab.schema_id) + '.' + pk_tab.name as primary_table,st.row_count as[PK_Satır Sayısı],
fk_col.name as fk_column_name,
pk_col.name as pk_column_name,
fk.name as fk_constraint_name
from sys.foreign_keys fk
inner join sys.tables fk_tab
on fk_tab.object_id = fk.parent_object_id
inner join sys.tables pk_tab
on pk_tab.object_id = fk.referenced_object_id
inner join sys.foreign_key_columns fk_cols
on fk_cols.constraint_object_id = fk.object_id
inner join sys.columns fk_col
on fk_col.column_id = fk_cols.parent_column_id
and fk_col.object_id = fk_tab.object_id
inner join sys.columns pk_col
on pk_col.column_id = fk_cols.referenced_column_id
and pk_col.object_id = pk_tab.object_id
inner join sys.dm_db_partition_stats st on st.object_id=pk_tab.object_id
inner join sys.dm_db_partition_stats st2 on st2.object_id=fk_tab.object_id
where pk_tab.name='AracIslem' or fk_tab.name='AracIslem'-- Tablo İsmi

Başka makalede görüşmek dileğiyle..
Onlar, yaptıkları dünyada ve ahirette boşa gitmiş olanlardır. Ve onların yardımcıları yoktur. Al-i İmran Suresi, 22. Ayet