---
title: Anahtarlar
source: 'https://academia.sh/tr/kurslar/iliskisel-kuram/anahtarlar'
course: 'Veri Modelleme ve İlişkisel Kuram'
language: tr
updated: '2026-08-17T18:09:00+00:00'
license: 'CC BY-SA 4.0'
---

# Anahtarlar

Süperanahtar, aday anahtar, birincil anahtar, alternatif anahtar ve yabancı anahtar tanımları; doğal ile vekil anahtar arasındaki seçim ve anahtar seçim ölçütleri.

Önceki ders iki kez aynı noktaya çıktı: satırların birbirinden ayırt edilebilmesi gerekiyor
ve bu ayırt etme şemada söylenmedikçe gerçekleşmiyor. SQL tablosu, hiçbir şey söylenmezse
aynı satırı iki kez kabul eden bir çok kümedir. Bu dersin sorusu şudur: bir satırı tek
başına belirleyen sütun kümesi nasıl tanımlanır, birden çok aday varsa hangisi seçilir, ve
bir bağıntının satırı başka bir bağıntının satırına nasıl bağlanır?

## Süperanahtar ve Aday Anahtar

Bir bağıntının başlığındaki öznitelikler kümesine $H$ diyelim. $K \subseteq H$ alt kümesi,
bağıntının hiçbir geçerli değerinde iki farklı satır $K$ üzerinde aynı değerleri taşımıyorsa
bir **süperanahtardır** (superkey). Yani $K$ üzerindeki değerler satırı belirler.

Bu tanım fazla cömerttir: bir süperanahtara gereksiz sütun eklemek onu yine süperanahtar
bırakır. Üye bağıntısında `uye_no` satırı belirliyorsa, `(uye_no, ad)` de belirler.
Gereksizliği elemek için indirgeme yapılır: hiçbir öz alt kümesi süperanahtar olmayan bir
süperanahtara **aday anahtar** (candidate key) denir. Aday anahtar, en küçük belirleyici
sütun kümesidir.

Bir bağıntının birden çok aday anahtarı olabilir. Üye bağıntısında üye numarası da
e-posta adresi de satırı tek başına belirler:

```sh
sqlite3 :memory: <<'SQL'
CREATE TABLE uye (
  uye_no       INTEGER PRIMARY KEY,
  eposta       TEXT NOT NULL UNIQUE,
  ad           TEXT NOT NULL,
  kayit_tarihi TEXT NOT NULL
);
INSERT INTO uye VALUES (41, 'ayse.demir@ornek.org', 'Ayşe Demir', '2024-09-12');
INSERT INTO uye VALUES (52, 'ayse.demir@ornek.org', 'Ayşe D. Demir', '2025-01-08');
SQL
```

```
Runtime error near line 8: UNIQUE constraint failed: uye.eposta (19)
```

İkinci ekleme farklı bir üye numarası taşımasına rağmen reddedilir, çünkü e-posta adresi de
bir aday anahtardır ve o adres zaten kullanılmıştır. Aday anahtarlık, bugünkü veride
yinelenme bulunmamasından değil, **hiçbir zaman bulunamayacağı kuralından** gelir. Bu ayrım
önemlidir: veride şu an tekrar etmeyen bir sütun anahtar sanılabilir. Doğru soru "şu anda
tekrar ediyor mu" değil, "tekrar etmesi mümkün mü" sorusudur. Kütüphane bağlamında üye adı
buna iyi bir örnektir — bugün tekrar etmiyor olması, iki Ayşe Demir'in üye olamayacağı
anlamına gelmez.

## Birincil ve Alternatif Anahtar

Aday anahtarlardan biri, bağıntının resmî kimliği olarak seçilir; buna **birincil anahtar**
(primary key) denir. Seçilmeyen aday anahtarlara **alternatif anahtar** (alternate key)
denir ve onlar da şemada tekillik kısıtı olarak yazılır — yukarıdaki `UNIQUE` bunu yapar.

Birincil anahtar seçimi bir tercih meselesidir ve motorun davranışını da etkiler: satırlara
başka bağıntılardan yapılan başvurular birincil anahtar üzerinden kurulur, dizin genellikle
onun üzerine düşer.

```sh
sqlite3 :memory: <<'SQL'
CREATE TABLE uye (
  uye_no INTEGER PRIMARY KEY,
  eposta TEXT NOT NULL UNIQUE,
  ad     TEXT NOT NULL
);
INSERT INTO uye VALUES (41, 'ayse.demir@ornek.org', 'Ayşe Demir');
INSERT INTO uye VALUES (41, 'mert.kaya@ornek.org', 'Mert Kaya');
SQL
```

```
Runtime error near line 7: UNIQUE constraint failed: uye.uye_no (19)
```

## Bileşik Anahtar

Anahtar tek sütundan oluşmak zorunda değildir. Birden çok sütunun birlikte oluşturduğu
anahtara **bileşik anahtar** (composite key) denir. Kütüphanede bir kitabın fiziksel
kopyası — bundan sonra **nüsha** — üç şeyle belirlenir: hangi kitap, hangi şube, o şubedeki
kaçıncı kopya.

```sh
sqlite3 :memory: <<'SQL'
CREATE TABLE nusha (
  isbn      TEXT    NOT NULL,
  sube_kodu TEXT    NOT NULL,
  kopya_no  INTEGER NOT NULL,
  PRIMARY KEY (isbn, sube_kodu, kopya_no)
);
INSERT INTO nusha VALUES ('978-975-0000-01-1', 'MRK', 1),
                         ('978-975-0000-01-1', 'MRK', 2),
                         ('978-975-0000-01-1', 'BHC', 1);
INSERT INTO nusha VALUES ('978-975-0000-01-1', 'BHC', 1);
SQL
```

```
Runtime error near line 10: UNIQUE constraint failed: nusha.isbn, nusha.sube_kodu, nusha.kopya_no (19)
```

Aynı kitabın Merkez şubesindeki birinci ve ikinci kopyası ile Bahçelievler şubesindeki
birinci kopyası ayrı satırlardır; dördüncü ekleme üçüncüyle çakıştığı için reddedilir.
Bileşik anahtarın sütun sırası anahtarlık açısından önemsizdir — küme kümedir — ama dizin
davranışı açısından önemlidir; bu ayrım motorun iç yapısını ele alan kurslara aittir.

## Doğal ve Vekil Anahtar

Anahtar, alanın kendi verisinden gelebilir ya da kimliklendirme amacıyla üretilmiş olabilir.
Alanın kendi verisinden gelene **doğal anahtar** (natural key) denir: kitabın ISBN'i, şube
kodu, üyenin e-posta adresi. Yalnızca satırı ayırt etmek için üretilene **vekil anahtar**
(surrogate key) denir: ödünç işleminin sıra numarası gibi.

```sh
sqlite3 :memory: <<'SQL'
.headers on
.mode box
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  uye_no      INTEGER NOT NULL,
  alis_tarihi TEXT    NOT NULL
);
INSERT INTO odunc (uye_no, alis_tarihi) VALUES (41, '2025-03-02'), (52, '2025-03-04');
SELECT * FROM odunc;
SQL
```

```
┌──────────┬────────┬─────────────┐
│ odunc_no │ uye_no │ alis_tarihi │
├──────────┼────────┼─────────────┤
│ 1        │ 41     │ 2025-03-02  │
│ 2        │ 52     │ 2025-03-04  │
└──────────┴────────┴─────────────┘
```

Ekleme deyimi `odunc_no` sütununa değer vermedi; değerler sistem tarafından üretildi.
**Kimlik sütununun nasıl üretildiği motora göre değişir**: kimi motorda ayrı bir sıra
üreteci nesnesi tanımlanır, kimi motorda sütun bildiriminde belirtilir, kiminde tablonun
gizli satır numarası kullanılır. Üretilen değerlerin boşluksuz artacağı hiçbir motorda
güvence değildir; geri alınan bir işlemin tükettiği numara geri gelmez. Vekil anahtarı
"kaçıncı kayıt" diye okumak bu yüzden hatalıdır.

Doğal anahtar veriyi anlamlı kılar ve fazladan sütun gerektirmez; buna karşılık alanın
kuralları değiştiğinde değişebilir. Vekil anahtar değişmez ve dardır; buna karşılık
anlamsızdır, tekilliği kendi başına güvenceye almaz — vekil anahtar konan bir bağıntıda
doğal aday anahtar yine de `UNIQUE` ile yazılmalıdır, yoksa aynı kitap iki farklı numarayla
iki kez girilebilir.

## Yabancı Anahtar

Bağıntılar birbirine **yabancı anahtarla** (foreign key) bağlanır: bir bağıntıdaki sütun
kümesinin değerleri, başka bir bağıntının aday anahtar değerleri arasında bulunmak
zorundadır.

```sh
sqlite3 :memory: <<'SQL'
PRAGMA foreign_keys = ON;
CREATE TABLE uye (
  uye_no INTEGER PRIMARY KEY,
  ad     TEXT NOT NULL
);
CREATE TABLE odunc (
  odunc_no    INTEGER PRIMARY KEY,
  uye_no      INTEGER NOT NULL REFERENCES uye (uye_no),
  alis_tarihi TEXT    NOT NULL
);
INSERT INTO uye VALUES (41, 'Ayşe Demir');
INSERT INTO odunc VALUES (1001, 41, '2025-03-02');
INSERT INTO odunc VALUES (1002, 77, '2025-03-04');
SQL
```

```
Runtime error near line 13: FOREIGN KEY constraint failed (19)
```

`41` numaralı üye tabloda bulunduğu için ilk ödünç kaydı geçer; `77` numaralı üye
bulunmadığı için ikincisi reddedilir. Yabancı anahtar, ilişkisel modelde bağıntıları
birbirine bağlayan tek düzenektir — satırlar birbirine işaretçiyle değil, **değerle**
bağlanır. Bu, Veri Yapıları kursundaki bağlı listelerden temel bir ayrılıştır: bağlantı
bellek adresine değil, anahtar değerine dayandığı için veritabanı kapatılıp açıldığında,
başka bir makineye taşındığında ya da yedekten geri yüklendiğinde geçerliliğini korur.

## Anahtar Seçimi Ölçütleri

Aday anahtarlar arasından birincil anahtarı seçerken dört ölçüt işe yarar.

- **Kararlılık.** Anahtar değerinin değişmemesi gerekir; ona başvuran her satır o değeri
  taşır. E-posta adresi bu yüzden kötü bir birincil anahtardır, iyi bir alternatif
  anahtardır.
- **Darlık.** Anahtar, ona başvuran her bağıntıda tekrar eder ve dizinlerde yer kaplar. Üç
  metin sütunlu bileşik anahtar yerine tek tam sayı, başvuru sayısı arttıkça belirgin fark
  yaratır.
- **Bölünmezlik.** İçinde ayrıştırılabilir bilgi taşıyan anahtar — şube kodu ile yılı
  birleştiren bir dizgi gibi — kural değiştiğinde bozulur.
- **Gizlilik.** Anahtar, dışarıya verilen adreslerde ve bağlantılarda görünür. Kimlik
  numarası gibi kişisel bir değeri birincil anahtar yapmak, onu görünür kılmayı da
  beraberinde getirir.

## Özet

- Süperanahtar satırı belirleyen herhangi bir sütun kümesidir; aday anahtar, hiçbir öz alt
  kümesi süperanahtar olmayan süperanahtardır.
- Aday anahtarlardan biri birincil anahtar seçilir; kalanlar alternatif anahtar olarak
  tekillik kısıtıyla yazılır.
- Anahtarlık bugünkü veriden değil, veriye konan kuraldan gelir; "şu an tekrar etmiyor"
  anahtarlık kanıtı değildir.
- Doğal anahtar veriden gelir ve değişebilir; vekil anahtar üretilir ve değişmez, ancak
  doğal aday anahtarın tekilliğini şemadan kaldırmaz.
- Yabancı anahtar, satırları adresle değil değerle bağlar; bu yüzden taşıma ve geri yükleme
  altında geçerliliğini korur.

## Sonraki Adım

Bu derste yabancı anahtar tanımlandı ve bir ihlali reddedildi, ama arkasındaki kural
adlandırılmadı: neden var olmayan bir üyeye ödünç kaydı yazılamıyor, ve o üye kaydı sonradan
silinmek istenirse ne olmalı? Sıradaki ders, anahtarların dayandığı iki bütünlük kuralını —
varlık bütünlüğü ile başvuru bütünlüğünü — tanımlar ve silme ile güncelleme durumunda
sistemin seçebileceği davranışları gösterir.
