Birincil Anahtar (Primary Key) Nedir?
Kısa tanım
Birincil anahtar (primary key), ilişkisel bir tablodaki her satırı benzersiz biçimde tanımlayan sütun veya sütun grubudur. Değeri boş (NULL) olamaz, iki satırda tekrar edemez ve her tabloda en fazla bir tane bulunur. Veritabanı birincil anahtar için otomatik olarak benzersiz bir indeks oluşturur; diğer tablolar bir satıra yabancı anahtar aracılığıyla bu değer üzerinden başvurur.
Diğer adları: primary key, PK, ana anahtar

Bir birincil anahtardan beklenenler
Birincil anahtar, bir satırın kimliğidir. Veritabanı üç kuralı zorunlu kılar: değer benzersizdir, NULL olamaz ve bir tabloda yalnızca bir birincil anahtar tanımlanabilir (birden fazla sütundan oluşabilir). Bunlara veritabanının zorlamadığı ama tasarımın gerektirdiği dördüncü bir kural eklenir: anahtar değişmemelidir. Başka tablolar bu değeri yabancı anahtar olarak sakladığı, URL'lerde ve önbellek anahtarlarında kullanıldığı için bir kimliği sonradan değiştirmek zincirleme güncellemeler doğurur.
Veritabanı birincil anahtar için otomatik olarak benzersiz bir indeks oluşturur; PostgreSQL'de bu bir B-tree indekstir. MySQL'in InnoDB motorunda ise birincil anahtar bundan da fazlasıdır: tablo verisi fiziksel olarak bu anahtarın sırasına göre saklanır.
Doğal anahtar mı, yapay anahtar mı?
Doğal anahtar, veride zaten var olan ve benzersiz olduğu düşünülen bir değerdir: e-posta adresi, ISBN, vergi numarası. Yapay (surrogate) anahtar ise yalnızca kimlik olsun diye üretilen, iş anlamı taşımayan bir değerdir. Pratikte yapay anahtar çoğu zaman daha güvenlidir, çünkü doğal anahtarlar beklenmedik biçimde değişir: kullanıcı e-postasını günceller, bir kod sisteminin formatı değişir. Kişisel veri içeren bir değeri birincil anahtar yapmak, o veriyi ona başvuran her tabloya, log kaydına ve URL'ye de yaymak anlamına gelir. Yaygın ve sağlam desen, yapay bir birincil anahtarın yanında doğal değeri ayrı bir UNIQUE kısıtıyla korumaktır:
CREATE TABLE customers (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email text NOT NULL UNIQUE,
full_name text NOT NULL
);
-- Ara tabloda bileşik birincil anahtar
CREATE TABLE product_tags (
product_id bigint NOT NULL REFERENCES products (id),
tag_id bigint NOT NULL REFERENCES tags (id),
PRIMARY KEY (product_id, tag_id)
);Otomatik artan sayı mı, UUID mi?
| Seçenek | Artıları | Dikkat edilecekler |
|---|---|---|
| Otomatik artan tamsayı | Küçük (8 bayt), sıralı, okunması kolay | Kimliği öğrenmek için veritabanına yazmak gerekir; URL'de kayıt sayısını ele verir; ayrı veritabanlarını birleştirirken çakışır |
| Rastgele UUID (v4) | Uygulamada, hatta istemcide üretilebilir; tahmin edilemez | 16 bayt; rastgele dağıldığı için B-tree indekste parçalanmaya yol açar |
| Zaman sıralı UUID (v7) | UUID'nin avantajlarını sıralı eklemeyle birleştirir | Oluşturulma zamanını kabaca açığa çıkarır |
Tamsayı seçildiğinde 32 bitlik int yerine bigint kullanmak ucuz bir sigortadır; yaklaşık 2,1 milyar sınırına dayanan bir tabloyu canlıda dönüştürmek zahmetlidir. Sıralı kimliklerin URL'de görünmesi tek başına bir güvenlik açığı değildir, ama her istekte kaydın o kullanıcıya ait olup olmadığı yetkilendirme katmanında mutlaka kontrol edilmelidir; aksi hâlde kimliği bir artırarak başkasının verisine ulaşılabilir.
Sık görülen yanlış anlamalar
- “Kimlikler boşluksuz ilerler.” Geri alınan işlemler ve silinen satırlar sıra numaralarını tüketir; 1, 2, 5, 9 gibi boşluklar normaldir. Fatura numarası gibi kesintisiz olması gereken değerler birincil anahtardan ayrı üretilmelidir.
- “Birincil anahtar olmadan da olur.” Birincil anahtarı olmayan tablolarda yinelenen satırları ayırt etmek zorlaşır; ORM'ler ve bazı replikasyon araçları da satırı tanımlayacak bir anahtar bekler.
- “Kimlik bilgi taşısın.” Ülke kodu veya tarih gömülen anahtarlar, o bilgi değiştiğinde anlamını yitirir. İş anlamı ayrı sütunlarda durmalıdır.
Birincil anahtar seçimi, veritabanı şeması tasarımında sonradan değiştirilmesi en pahalı kararlardan biridir; bu yüzden ilk tablolarda üzerinde durmaya değer.

