Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
MySQL’de primary key (birincil anahtar), tablodaki her satırı benzersiz biçimde tanımlayan sütun veya sütun grubudur. Bir primary key değeri tekrarlanamaz ve NULL olamaz. Her tabloda en fazla bir primary key tanımlanır; ancak bu anahtar tek sütundan veya birden fazla sütundan oluşabilir.

Primary key, bir kaydı diğerlerinden ayırmak, ilişkili tablolarda doğru satıra referans vermek ve güncelleme-silme işlemlerini güvenilir yapmak için kullanılır. AUTO_INCREMENT ise primary key’in kendisi değil, sayısal değerleri otomatik üretmeye yarayan ek bir özelliktir.

En küçük çalışan örnek​


Aynı isimli tabloların bulunmadığı ayrı deneme veritabanında aşağıdaki örnek teknik kullanıcı kimliği oluşturur. Şema komutlarını gerçek uygulamanızın tabloları üzerinde denemeyin:

Kod:
CREATE TABLE pk_demo_users (
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(255) NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uq_users_username (username),
    UNIQUE KEY uq_users_email (email)
) ENGINE=InnoDB;

INSERT INTO pk_demo_users (username, email)
VALUES ('ayse', '[email protected]');

SET @new_user_id = LAST_INSERT_ID();

SELECT id, username, email
FROM pk_demo_users
WHERE id = @new_user_id;

Başarılı sonuçta tablo oluşturulur, eklenen satıra otomatik bir id atanır ve SELECT sorgusu bu satırı döndürür. Aynı mevcut id değerini yeniden eklemek benzersizliği ihlal eder. Ancak bu AUTO_INCREMENT sütununa NULL göndermek yeni kimlik üretimini tetikleyebilir; depolanan anahtar yine NULL olmaz. Örnek üretilen kimliği LAST_INSERT_ID ile alır; her sunucuda ilk kimliğin 1 olduğunu varsaymaz. username ve email için ayrıca UNIQUE tanımlanmasının nedeni, bu alanların da tekrar etmemesi isteniyorsa bunu açıkça belirtmektir; her benzersiz alan primary key olmak zorunda değildir.

Primary key seçerken karar tablosu​


Anahtar seçimi, verinin nasıl kullanılacağına ve başka tabloların bu kayda nasıl bağlanacağına göre yapılmalıdır:

SeçimNe zaman uygun?Dikkat edilmesi gereken
Tek sayısal sütunHer satırın bağımsız bir kimliği varsaKimlik tek başına anlam taşımamalı; değişmemesi tercih edilir
Birden fazla sütunİlişki tablosunda sütunların birlikte benzersiz olması gerekiyorsaReferans veren tablolarda tüm sütunlar birlikte taşınır
Doğal anahtarDeğeri gerçekten benzersiz ve kalıcıysaE-posta gibi değişebilen alanlar ileride ilişki güncellemelerini zorlaştırabilir
Otomatik sayısal kimlikBasit ve kısa bir teknik kimlik gerektiğindeSıralı olması iş anlamına geldiği anlamına gelmez

Başka tablolarla ilişkilendirme​


Bir tablo başka bir tablodaki kaydı gösteriyorsa, genellikle foreign key alanı parent tablonun primary key değerini tutar. Örneğin siparişlerin hangi kullanıcıya ait olduğunu saklamak için:

Kod:
CREATE TABLE pk_demo_orders (
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    total DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (user_id) REFERENCES pk_demo_users(id)
) ENGINE=InnoDB;

Burada pk_demo_orders.id siparişin, pk_demo_orders.user_id ise siparişin sahibi olan kullanıcının kimliğidir. Böylece sipariş tablosu kullanıcı adını tekrar tekrar saklamak yerine kullanıcı tablosundaki primary key’e bağlanır.

Sık yapılan hatalar​


  • Primary key yerine yalnızca index kullanmak: Normal bir index aramayı hızlandırabilir ancak tek başına benzersizlik veya NULL yasağı sağlamaz.
  • Anlamlı ve değişken bilgiyi anahtar yapmak: E-posta, telefon veya kullanıcı adı değişebileceği için teknik kimlik olarak kullanıldığında ilişkili kayıtların güncellenmesi zorlaşabilir.
  • AUTO_INCREMENT değerlerini iş kuralı sanmak: Kimlik numarasındaki boşluklar normal olabilir. Bu değerler fatura numarası, sıra numarası veya başka bir iş kuralı yerine geçmemelidir.
  • Birden fazla primary key tanımlamaya çalışmak: Bir tabloda tek bir primary key tanımı bulunur. Birden fazla sütunun birlikte anahtar olması isteniyorsa bunlar tek bir bileşik primary key içinde yazılır.
  • Bileşik anahtarın yalnızca bir sütununu benzersiz sanmak: PRIMARY KEY (user_id, product_id) tanımı, sütunların ayrı ayrı değil birlikte tekrar etmemesini zorunlu kılar.

Bir tablo için seçim yaparken önce “Bu satırı değişmeden ve benzersiz biçimde nasıl tanımlarım?” sorusunu yanıtlayın. Genellikle ayrı bir teknik kimlik kullanıp, iş açısından benzersiz olması gereken alanlara ayrıca UNIQUE kısıtı eklemek, bu iki ihtiyacı birbirinden ayırır.

Sık sorulan sorular​

Primary key olmadan tablo oluşturulabilir mi?​

MySQL buna izin verebilir; fakat sunucudaki zorunluluk veya görünmez anahtar üretim ayarları sonucu etkileyebilir. InnoDB’nin kendi satır tanımlama davranışını uygulamanızda açıkça seçilmiş bir iş anahtarı sanmayın. Kayıtları uygulama üzerinden güvenilir tanımlamak için uygun açık anahtar tasarlayın.

Primary key sonradan eklenebilir mi?​

Evet. Seçilen sütunların mevcut verileri uygun olmalı; tekrarlar ve NULL değerler önce çözülmelidir. ALTER TABLE büyük tabloda yeniden düzenleme ve kilit etkisi oluşturabilir. Yalnız sözdiziminin doğru olması, canlı ortamda bakım gerektirmeyeceği anlamına gelmez.

Birleşik anahtarda sütun sırası önemsiz midir?​

Birlikte benzersizliği anlatırken aynı sütun kümesi düşünülebilir; ancak indeksin sorgularda kullanılma biçimi sıradan etkilenir. Örneğin önce user_id gelen bir anahtar, her product_id aramasına aynı ölçüde yardımcı olmayabilir. Veri kimliği ile erişim örüntüsünü birlikte değerlendirin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic