Ana içeriğe geç

SQL Birincil Anahtar: Kapsamlı Teknik Eğitim

Bu teknik eğitimde, bir SQL birincil anahtarın ne olduğunu ve veritabanı ilişkileri ile sorgu performansındaki işlevini anlayın.
· 10 dk. oku

Yapay Zeka ile Keşfedin

İlişkisel veritabanlarında birincil anahtar, bir tablodaki verilerin tekilliğini ve bütünlüğünü sağlamada kritik bir rol oynar. Birincil anahtar, bir tablodaki her kaydı benzersiz şekilde tanımlayan, indekslemeye temel oluşturan, varlık bütünlüğünü zorlayan ve tablolar arasında ilişkiler kuran bir kısıtlamadır.

Bu eğitimde, SQL birincil anahtarlarını derinlemesine inceleyerek temel ilkeleri, uygulama yöntemlerini ve iyileştirme tekniklerini ele alacağım. Ayrıca yaygın hatalar ve en iyi uygulamalar ile gerçek dünya senaryolarını da kapsayacağım. Hâlâ SQL öğreniyorsanız, kapsamlı SQL yol haritamıza göz atmanızı ve SQL Fundamentals beceri yolumuzu almanızı öneririm. 

SQL Birincil Anahtar nedir?

SQL birincil anahtar, bir tablodaki her satırı benzersiz olarak tanımlayan bir sütun veya sütunlar kümesidir. Bu, iki satırın aynı birincil anahtar değerine sahip olamayacağı anlamına gelir. Bir tablonun yalnızca bir birincil anahtarı olabilir ve bu anahtar bir veya birden fazla sütundan oluşabilir.

Birincil anahtarlar, veri bütünlüğünü zorlamak ve verimli sorgulamayı mümkün kılmak için hayati öneme sahiptir. Şimdi bazı temel noktaları ele alalım.

Birincil anahtarlar, veritabanı normalizasyonu ve ilişkisel bütünlük için gereklidir.

Birincil anahtarların temel özellikleri

  1. Benzersizlik: Birincil anahtar sütun(lar)ındaki her değerin benzersiz olmasını sağlar.
  2. Boş olmama: Birincil anahtar sütunları NULL değer içeremez.
  3. Değişmezlik: İdealde, başvuran tablolarda tutarsızlıkları önlemek için birincil anahtar değerleri yaşam döngüleri boyunca değişmeden kalmalıdır.

Kısıtlamalar ve indeksleme

Bir birincil anahtar tanımlandığında, veritabanı kısıtlamayı uygulamak için otomatik olarak benzersiz bir indeks oluşturur. Bu indeks, özellikle arama işlemlerinde sorgu performansını hızlandırır.

Bu indeks sistemi sayesinde, birincil anahtarlar veritabanı motoruna yürütme planı optimizasyonunda yardımcı olur. Bu da sorgularınızın daha hızlı çalışmasını sağlar.

Birincil anahtarlar için yaygın veri tipleri

Birincil anahtarlar çeşitli veri türlerinden olabilir. İşte yaygın olarak kullanılan bazı türler:

  • INTEGER veya SERIAL: Verimli ve en yaygın kullanılan.
  • BIGINT: Milyarlarca satır depolaması beklenen tablolar için kullanışlı.
  • UUID: Dağıtık sistemler ve sıralı öngörülebilirlikten kaçınmak için iyi.
  • CHAR/VARCHAR: Dikkatle kullanılır, genellikle gerekli olduğunda doğal anahtarlarda.

SQL Birincil Anahtar Türleri ve Mimarisi

Birincil anahtarlar, yapıları ve kökenlerine göre çeşitli türlere ayrılabilir. Bazı örnekler şunlardır:

  • Doğal anahtarlar: Mevcut verilerden türetilir (ör. Sosyal Güvenlik Numarası, e-posta) ve iş kullanıcıları için anlaşılması kolay, çoğu zaman anlamlıdır. Ancak bu, güncelleme, çoğaltma ve olası gizlilik sorunları riski taşır.
  • Vekil anahtarlar: Genellikle SERIAL, BIGSERIAL veya UUID ile uygulanan, sistem tarafından üretilen kimlikler gibi yapay anahtarlar. Bu tür anahtarlar, sağlamlık, gizlilik ve daha kolay bakım sağlar.

Özelliklere göre karşılaştırdığımızda, farklarını aşağıdaki özet tabloda görebiliriz:

Özellik

Doğal Anahtar

Vekil Anahtar

İş Anlamı

Var

Yok

Kararlılık

Çoğunlukla kararsız

Oldukça kararlı

Performans

Büyük alanlar gerektirebilir

Genellikle kompakt

Gizlilik Endişeleri

Daha yüksek

Daha düşük

Bileşik birincil anahtar mimarisi

Bileşik birincil anahtar, tablolarda benzersiz anahtar üretmenin yaygın bir yoludur. Anahtar genellikle iki veya daha fazla sütunda bulunan verilerden türetilir.

Bu tür anahtarlar, ilişkinin kendisinin benzersizliği gerektirdiği bağlantı veya ilişkilendirici tablolarda yaygındır.

  • Örnek: course_enrollments tablosu, student_id ve course_id bileşik anahtarını kullanabilir.

Dikkate alınacaklar:

  • Minimalizm: Bileşik anahtarda gereksiz sütunlardan kaçının.
  • Karmaşıklık: Birleşimler ve yabancı anahtar başvuruları daha karmaşık hale gelir.
  • İndeks Boyutu: İndeksler büyüyebilir ve performansı etkileyebilir.

Veritabanlarında kullanılan ek anahtarlar

Birincil anahtarın yanı sıra kullanılabilecek başka anahtarlar da vardır, örneğin:

  • Aday anahtar: Bir satırı benzersiz olarak tanımlayabilen öznitelik kümesi.
  • Süper anahtar: Bir aday anahtarın herhangi bir üst kümesi (ek sütunlar içerir).
  • Alternatif anahtar: Birincil anahtar olarak seçilmeyen bir aday anahtar.

Hangi veri alanını birincil anahtar olarak kullanacağınıza karar verirken aşağıdaki faktörleri değerlendirebilirsiniz:

  • Veri değişim sıklığı: Veriler ne sıklıkla değişiyor?
  • Sütun veri türü ve boyutu: Veri türü indeksleme için uygun mu?
  • Beklenen sorgu kalıpları: Bu alan sorgulama için uygun olacak mı?

SQL'de Birincil Anahtarları Tanımlama ve Değiştirme

Şimdi, SQL komutlarını kullanarak PostgreSQL'de birincil anahtarları nasıl bildirebileceğimize ve yönetebileceğimize bakalım. 

Tablo oluşturma, mevcut tabloları değiştirme ve kısıtlama davranışını yönetme gibi çeşitli senaryolardan geçeceğiz.

Bildirim ve değiştirme sözdizimi

Tablo oluşturma sırasında

Tablo oluşturma aşamasında, bulunması muhtemel alanları oluşturmalısınız. Bu örnekte, benzersiz tamsayılardan oluşan bir çalışan kimliği oluşturacağız.

CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,  -- Automatically generates unique integers
    name TEXT NOT NULL,              -- Basic text field, required
    email TEXT UNIQUE                -- Unique constraint to prevent duplicate emails
);

SQL komutları hakkında daha fazlası için SQL Temelleri Şipşak Kılavuzumuzu inceleyin.

sql basics cheat sheet

Bu örnek, SERIAL sözde türünü kullanarak satır içinde bir birincil anahtar tanımlamayı gösterir. PostgreSQL, SERIAL'ı, vekil anahtarlar için ideal olan otomatik artan tamsayı sütunu olarak ele alır. E-posta sütununa ayrıca bir UNIQUE kısıtlaması verilir; bu da onun alternatif anahtar olarak hizmet edebilmesini sağlar.

ALTER TABLE kullanma

Şimdi, employee_id'yi birincil anahtar olarak belirleyelim.

ALTER TABLE employees ADD PRIMARY KEY (employee_id);

Bu komut, bir tablo birincil anahtar olmadan zaten oluşturulmuşsa ve sonradan bir tane eklemek istiyorsanız kullanılır. Birincil anahtar ekleyeceğiniz sütunun NULL veya yinelenen değerler içermediğinden emin olun; aksi halde komut başarısız olur.

Birincil anahtarı kaldırma

Artık birincil anahtarımız ayarlandığına göre, birincil anahtar kısıtlamasını da kaldırabilirsiniz.

ALTER TABLE employees DROP CONSTRAINT employees_pkey;

Mevcut bir birincil anahtar kısıtlamasını kaldırmak için bu ifadeyi kullanın. employees_pkey kısıtlama adı, PostgreSQL'in varsayılan adlandırma kuralını (<table>_pkey) takip eder. Bu, tablo şemasını yeniden tasarlarken veya farklı bir birincil anahtar sütununa geçerken yararlıdır.

PostgreSQL'de birincil anahtarlar için varsayılan kısıtlama adı table_name_pkey biçimindedir.

PostgreSQL hakkında daha fazla bilgi için şipşak kılavuzumuza göz atın.

postgresql cheat sheet

Null işleme ve çakışma yönetimi

Birincil anahtar sütunlarında NULL değerlere izin verilmez. Yinelenen değerler de kısıtlama ihlali hatalarına neden olur

Bunu yönetmek için bazı stratejiler şunlardır:

  • Yinelenenlerden kaçınmak için INSERT ... ON CONFLICT kullanmak.
  • Eklemeden önce anahtar uygunluğunu kontrol etmek için işlemler kullanmak.

Otomatik artış ve küresel tanımlayıcı stratejileri

PostgreSQL'in SERIAL, BIGSERIAL ve IDENTITY türleri kimlik oluşturmayı basitleştirir.

Buna ek olarak, UUID'ler güvenli küresel tanımlayıcılar sağlar. Sırasız ve öngörülemez yapıları, özellikle numaralandırma saldırılarını önlemede güvenliği de artırır. 

İşte bir UUID'nin nasıl oluşturulup birincil anahtar olarak kullanılabileceğine dair bir uygulama

CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE users (
    user_id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    username TEXT NOT NULL
);

İlişkilerde Birincil Anahtarlar ve Performansı Artırma

Birincil anahtarlar, ilişkisel tablolar arasında tutarlılığı sağlamak ve performansı artırmak için gereklidir.

Varlık bütünlüğünü zorlama

Varlık bütünlüğü, birincil anahtarlar aracılığıyla NULL ve yinelenen değerlere izin verilmemesiyle sağlanır. Benzersiz bir tanımlayıcıya sahip olmak, ekleme/güncelleme işlemleri sırasında veri anormalliklerini önlemeye yardımcı olur.

Yabancı anahtarlar ve başvuru bütünlüğü

Yabancı anahtarlar, başvurulan tablodaki mevcut birincil anahtar değerleriyle eşleşmelidir. Başvuru bütünlüğü, tablolar arasındaki tüm başvuruların geçerli kalmasını sağlar ve var olmayan veriye başvuru yapılan "yetim kayıtları"nı önler.

Basamaklı eylemler, başvurulan birincil anahtarlar değiştiğinde tutarlılığı korur. 

Buna aşağıdaki yaygın basamaklı işlevler dahil olabilir:

  • ON DELETE CASCADE
  • ON UPDATE CASCADE
  • SET NULL ve SET DEFAULT

İndeksleme ve sorgu optimizasyonu

Birincil anahtarlar üzerindeki benzersiz indeksler, SELECT ve JOIN sorgularını hızlandırır. Ancak, zayıf anahtar tasarımı şişkin indekslere ve düşen performansa yol açabilir.

Sorgularınız yavaşsa ve bunun kötü indekslemeden kaynaklandığından şüpheleniyorsanız, sorgu planlarını incelemek ve indeks kullanımını değerlendirmek için EXPLAIN ANALYZE kullanın.

Tasarım En İyi Uygulamaları ve Olası Tuzaklar

İyi anahtar tasarımı, sürdürülebilirlik, performans ve ölçeklenebilirliği destekler. Bazı en iyi uygulamalara ve yaygın hatalara bakalım.

Anahtar seçimi yönergeleri

  • Kısa, sabit uzunluklu veri türlerini seçin (ör. INT, UUID).
  • Değişme olasılığı yüksek anahtarlardan kaçının.
  • Mantıksal dolaşıklığı önlemek için anahtarın içinde gömülü bir iş anlamı olmamasını sağlayın.
  • Basitlik ve normalizasyon için vekil anahtarlar kullanın.

Yaygın uygulama hataları

  • Birden fazla birincil anahtar kullanmak (tablo başına yalnızca bir tane izin verilir).
  • Benzersiz kısıtlamaları birincil anahtar olarak yanlış etiketlemek.
  • Birincil anahtar tanımlamamak; bu da yetim kayıtlara yol açar.

Çözümler şunları içerir:

  • ALTER TABLE ile eksik anahtarları eklemek.
  • Şema tasarımını normalize etmek.
  • Tutarlı adlandırma kuralları kullanmak.

Ölçeklenebilirlik hususları

Ölçeklenen bir veritabanı çözümü oluştururken, büyük veri kümeleri arasında birlik sağlamak için vekil anahtarlar kullanmaya çalışın. Zorunlu olmadıkça dağıtık sistemlerde bileşik anahtarlardan kaçının. Tablo/indeks boyutunuzun düzenli izlenmesi de şarttır.

Gelişmiş Uygulama Senaryoları

Dağıtık veritabanları veya eski sistemler gibi karmaşık sistemlerde birincil anahtarları ele almak, gelişmiş stratejiler gerektirir.

Dağıtık veritabanı sistemleri

Dağıtık veritabanları daha zorludur. Düğümler arasında anahtar üretiminin çakışmasız olmasını sağlamanız gerekir. Bunun için UUID'leri ve merkezileştirilmiş anahtar yönetim hizmetlerini kullanmayı deneyebilirsiniz

Bölümleme Dikkatleri:

  • Anahtarların sıcak noktalar oluşturmamasını sağlayın.
  • Parçalama yaparken karma veya rastgeleleştirilmiş anahtarlar kullanın.

Eski sistem geçişi

Bir eski veritabanından sistem geçişi yaparken, önce mevcut benzersiz tanımlayıcıları belirleyin. Ardından, doğal anahtarların yanına kademeli olarak vekil anahtarlar ekleyin.

Tam geçişten önce çift anahtar desteğini çalıştırarak temkinli ilerleyin.

Geçiş Süreci:

  1. Vekil anahtar sütunu ekleyin.
  2. Mevcut kayıtlar için anahtarları doldurun.
  3. Uygulama sorgularını değiştirin.
  4. Doğrulamanın ardından eski doğal anahtarları kaldırın.

PostgreSQL Kullanarak Birincil Anahtarların Gösterimi

Tablo oluşturmadan ve veri eklemeden önce, çalışan bir PostgreSQL ortamına ihtiyacınız var. Bu bölüm, PostgreSQL'i kurmaya yönelik kısa bir kılavuzla başlar; ardından birincil anahtar kavramlarını uygulamak için örnek bir veri kümesini tanımlama ve kullanma adımlarını içerir.

Adım 1: PostgreSQL için ilk kurulum

PostgreSQL'i henüz kurmadıysanız, başlamak için şu adımları izleyin:

  1. PostgreSQL'i kurun
    • Resmî web sitesini ziyaret edin: https://www.postgresql.org/download/
    • İşletim sisteminizi seçin (Windows, macOS veya Linux).
    • Yükleyiciyi indirin ve çalıştırın; PostgreSQL sunucusuyla birlikte pgAdmin'i (grafiksel arayüz) de kurduğunuzdan emin olun.
  2. PostgreSQL hizmetini başlatın
    • Kurulumdan sonra PostgreSQL hizmeti genellikle otomatik olarak başlar.
    • Ayrıca, işletim sistemi hizmet yöneticiniz üzerinden (ör. Windows'ta Services veya Linux'ta systemctl) elle de başlatabilirsiniz.
  3. pgAdmin'i başlatın veya CLI üzerinden bağlanın
    • pgAdmin'i kullanarak veritabanlarını görsel olarak yönetin ve sorgulayın.
    • Alternatif olarak, bir terminal açın ve şu komutla bağlanın:psql -U postgres
    • Farklıysa postgres'i gerçek PostgreSQL kullanıcı adınızla değiştirin.
  4. Yeni bir veritabanı oluşturun
    • pgAdmin içinde "Databases" üzerine sağ tıklayın ve "Create > Database" seçeneğini belirleyin.

  • Ya da şu SQL komutunu kullanın:```sql

CREATE DATABASE pk_tutorial;

Connect to the new database in psql with:```bash
\c pk_tutorial

Ortamınız hazır olduğunda, eğitimde zaten özetlenen veri kümesi kurulumunun geri kalanına devam edebilirsiniz.

Sırada, PostgreSQL kullanarak örnek bir veri kümesi oluşturmak için adım adım bir rehbere bakalım. Veri kümesi, birbiriyle ilişkili iki tablodan oluşur: customers ve orders.

customers tablosu sadelik için bir vekil anahtar kullanırken, orders tablosu küresel benzersizliği göstermek için UUID tabanlı bir birincil anahtar kullanır.

Adım 2: Tabloları oluşturma

İlk adım, şemayı tanımlamak ve her iki tablo için birincil anahtar kısıtlamalarını oluşturmaktır. Ayrıca ilişkisel bütünlüğü göstermek için orders.customer_id ile customers.customer_id arasında bir yabancı anahtar ilişkisi tanımlarız.

customers tablosu için birincil anahtar customer_id'dir.

orders tablosu için birincil anahtar order_id'dir.

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY, -- Auto-incremented surrogate key
    name TEXT NOT NULL,
    email TEXT UNIQUE -- Ensures no duplicate email addresses
);

CREATE TABLE orders (
    order_id UUID DEFAULT gen_random_uuid() PRIMARY KEY, -- Globally unique identifier
    order_date DATE NOT NULL,
    customer_id INT REFERENCES customers(customer_id) ON DELETE CASCADE -- Enforces referential integrity
);

Açıklama:

  • customer_id, benzersiz kimliklerin otomatik olarak üretilmesi için SERIAL anahtar sözcüğünü kullanır.
  • email, yinelenmeleri önlemek için UNIQUE kısıtlamasına sahiptir.
  • order_id, gen_random_uuid() ile otomatik olarak üretilen bir UUID'dir.
  • ON DELETE CASCADE ifadesi, bir müşteriyi sildiğinizde ilgili siparişlerinin de silinmesini sağlar.

pgAdmin arayüzünde bunun şöyle görünmesi gerekir:

creating tables

Adım 3: Örnek verileri ekleme

Sonraki adımda, tipik ekleme işlemleri sırasında birincil ve yabancı anahtarların nasıl davrandığını gözlemlemek için tablolara örnek kayıtlar ekleriz. Bu veriler, temel bir e-ticaret senaryosunu simüle eder.

INSERT INTO customers (name, email) VALUES
('Alice Tan', '[email protected]'),
('Ben Koh', '[email protected]'),
('Clara Lim', '[email protected]');

INSERT INTO orders (order_date, customer_id) VALUES
('2025-07-01', 1),
('2025-07-02', 2),
('2025-07-03', 3);

pgAdmin arayüzünde bunun şöyle görünmesi gerekir:

inserting data into tables

Adım 4: Verileri sorgulama

Son olarak, siparişler ve müşteriler arasında yabancı anahtarın nasıl sorunsuz ilişkisel birleşimler sağladığını göstermek için her iki tablodan bilgi getiren bir SQL JOIN sorgusu gerçekleştiriyoruz.

Çalıştıracağımız kod şudur:

SELECT o.order_id, o.order_date, c.name, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;

Örnek çıktı şöyledir:

creating queries and joins

Yukarıdaki görselde de görülebileceği gibi, çıktı tablosu her iki tablodan verileri gösterir. Örneğin, birleştirilmiş tabloda orders tablosundan order_date alanı ve customers tablosundan name alanı bulunur.

Sonuç

SQL birincil anahtarları, ilişkisel veritabanlarının temelini oluşturur; benzersizliği zorlar, verimli sorguları mümkün kılar ve veri bütünlüğünü destekler. 

Birincil anahtarların ilkelerini, sınıflandırmalarını, sözdizimini, en iyi uygulamalarını ve ileri düzey stratejilerini ele aldık. Daha fazla öğrenme kaynağı için Introduction to Relational Databases in SQL kursumuza veya Joining Data in SQL kursumuza göz atın.

Tercihiniz eğitim yazılarıysa, Integrity Constraints in SQL rehberi veya SQL Joins Şipşak Kılavuzu da büyük ölçüde yardımcı olacaktır.

SQL Birincil Anahtar SSS

Doğal anahtarlar ile vekil anahtarlar arasındaki farklar nelerdir?

Doğal anahtarlar, hâlihazırda var olan gerçek dünya verilerinden (ör. e-posta veya ulusal kimlik) türetilirken; vekil anahtarlar, satırları yalnızca benzersiz şekilde tanımlamak için kullanılan sistem tarafından üretilen değerlerdir (ör. otomatik artan kimlikler).

Bileşik birincil anahtarlar veritabanı tasarımını nasıl iyileştirir?

Bileşik birincil anahtarlar, benzersizliği sağlamak için birden fazla sütun kullanır; bu da bağlantı tablolarında ilişkileri daha iyi modellemeyi ve çoktan çoğa ilişkilerde çok öznitelikli benzersizliği zorlamayı mümkün kılar.

Birincil anahtar seçimi için en iyi uygulamalar nelerdir?

İyi bir birincil anahtar benzersiz, zaman içinde değişmeyecek kadar istikrarlı, boyut olarak minimal ve ideal olarak performans ve indeksleme verimliliği için sayısal olmalıdır.

Birincil anahtarlar veri bütünlüğüne nasıl katkıda bulunur?

Birincil anahtarlar, bir tablodaki her satırın benzersiz şekilde tanımlanmasını sağlar; böylece yinelenen kayıtları önler ve yabancı anahtarlar aracılığıyla doğru başvuru yapılmasını destekler.

Birincil anahtarların tablolar arası ilişkilerin kurulmasındaki rolünü açıklayabilir misiniz?

Birincil anahtarlar, diğer tablolardaki yabancı anahtarlar için referans noktası görevi görür; bu da ilişkisel bütünlüğü mümkün kılar ve normalize bir şemada bire-çok veya çoktan çoğa ilişkileri destekler.

Austin Chia

Yazar

Austin Chia

Ben Austin, sağlık sektöründe veri bilimci ve veri analisti olarak yıllara dayanan deneyime sahip bir blogger ve teknoloji yazarıyım. Biyoloji geçmişiyle başladığım teknoloji yolculuğumda, şimdi teknoloji blogum aracılığıyla başkalarının da aynı geçişi yapmasına yardımcı oluyorum. Teknolojiye olan tutkum, onlarca SaaS şirketine yazılı katkılar sunmama, başkalarına ilham vermeme ve deneyimlerimi paylaşmama vesile oldu.

Konular

İlgili