- Konu sahibi
- #1
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
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.
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:
Başarılı sonuçta tablo oluşturulur, eklenen satıra otomatik bir
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:
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:
Burada
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
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çim | Ne zaman uygun? | Dikkat edilmesi gereken |
|---|---|---|
| Tek sayısal sütun | Her satırın bağımsız bir kimliği varsa | Kimlik tek başına anlam taşımamalı; değişmemesi tercih edilir |
| Birden fazla sütun | İlişki tablosunda sütunların birlikte benzersiz olması gerekiyorsa | Referans veren tablolarda tüm sütunlar birlikte taşınır |
| Doğal anahtar | Değeri gerçekten benzersiz ve kalıcıysa | E-posta gibi değişebilen alanlar ileride ilişki güncellemelerini zorlaştırabilir |
| Otomatik sayısal kimlik | Basit ve kısa bir teknik kimlik gerektiğinde | Sı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
NULLyasağı 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.