- Konu sahibi
- #1
MySQL AUTO_INCREMENT nedir?
MySQL’de
AUTO_INCREMENT, bir tabloya yeni kayıt eklendiğinde sayısal bir sütun için sonraki değeri otomatik üreten özelliktir. En yaygın kullanım, her satırı benzersiz biçimde tanımlayan birincil anahtar sütunudur. Böylece her INSERT işleminde kimlik numarasını elle hesaplamanız veya yazmanız gerekmez.Nasıl çalışır?
Özellik genellikle
INT veya BIGINT türündeki bir PRIMARY KEY sütununda kullanılır. Sütunu INSERT komutunda belirtmezseniz MySQL uygun sonraki değeri üretir.Aşağıdaki örneği seçili bir test veritabanında ve aynı bağlantıda çalıştırın. Yeni, çakışmayan bir geçici tablo adı kullanır; aynı ad zaten varsa mevcut tabloyu silmek yerine örnek adını değiştirin. Kalıcı uygulama tablolarına kayıt eklemez.
Kod:
CREATE TEMPORARY TABLE demo_auto_increment (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO demo_auto_increment (username) VALUES ('ayse');
INSERT INTO demo_auto_increment (username) VALUES ('mehmet');
SELECT id, username FROM demo_auto_increment ORDER BY id;
Yeni örnek tabloda, otomatik artış adımı ve başlangıç ofseti varsayılan 1 ise ilk iki satırın ID’si 1 ve 2 olur. Özel sunucu ayarları veya önceden kullanılan gerçek tablolarda bu varsayımı kurmayın. Geçici tablo yalnız aynı oturumda görünür ve bağlantı kapanınca kaldırılır.
Yeni kaydın ID değerini alma
Uygulamanızın eklenen kaydın kimliğine ihtiyacı varsa, ekleme işleminden sonra aynı veritabanı bağlantısı üzerinde
LAST_INSERT_ID() değerini okuyabilirsiniz:
Kod:
INSERT INTO demo_auto_increment (username) VALUES ('zeynep');
SELECT LAST_INSERT_ID();
Tek satırlık bu eklemenin otomatik ID’si aynı bağlantıdan okunur. Çok satırlı INSERT için LAST_INSERT_ID() ilk otomatik üretilen değeri verir; son satırın ID’si varsayılmamalıdır. Başka bir bağlantı üzerinden sorgulamak veya tabloyu tekrar sorgulayıp en büyük ID’yi almak güvenilir bir yöntem değildir; aynı anda başka kayıtlar eklenebilir.
Önemli davranışlar ve kararlar
AUTO_INCREMENT değerleri aralıksız sıra numarası değildir. Bir kayıt silinirse veya ekleme işlemi başarısız olup geri alınırsa oluşan boş değer genellikle yeniden kullanılmaz. Bu nedenle bu sütunu fatura numarası, sıra numarası veya eksiksiz kayıt sayacı gibi yorumlamayın.
Tablo tasarlarken ID’nin olası büyüklüğünü dikkate alın. Küçük tablolar için
INT yeterli olabilir; çok büyük veri kümelerinde BIGINT daha geniş bir aralık sağlar. Tablolar arası ilişkilerde bu sütuna başvuran yabancı anahtarların türü ve işareti uyumlu seçilmelidir.Aşağıdaki kararlar pratikte en sık karşılaşılan durumları ayırır:
| İhtiyaç | Uygun yaklaşım | Dikkat edilmesi gereken |
|---|---|---|
| Satırları verimli biçimde ayırt etmek | AUTO_INCREMENT birincil anahtar | Değerlerin kesintisiz olması beklenmemeli |
| Kullanıcıya görünen, tahmin edilmesi zor kimlik | UUID veya ayrı bir genel kimlik alanı | AUTO_INCREMENT tek başına gizlilik sağlamaz |
| İçe aktarmada mevcut ID’leri korumak | ID değerini INSERT içinde açıkça vermek | Çakışan birincil anahtar değerleri ekleme hatasına yol açar |
Uygulamada kontrol listesi
- Kimlik sütununu
NOT NULL AUTO_INCREMENTolarak tanımlayın ve çoğu durumdaPRIMARY KEYyapın. - Yeni kayıt eklerken ID sütununu listeye almayın; diğer zorunlu sütunları gönderin.
- İşlem sonrasında gereken ID’yi aynı bağlantı üzerinden
LAST_INSERT_ID()ile alın. - Silme, geri alma veya eşzamanlı işlemler sonrasında ID’lerin arasında boşluk olabileceğini kabul edin.
- Bir tabloyu başka bir sistemden aktarırken açık ID kullanacaksanız çakışmaları ve sonraki otomatik değeri test edin.
AUTO_INCREMENT sütununu ekleme sırasında elle de belirtebilirsiniz. Bu, veri aktarımında yararlı olabilir; fakat mevcut birincil anahtar değerini tekrar kullanmaya çalışırsanız işlem başarısız olur. Elle verilen değerler ve tablo içindeki mevcut en yüksek değer, sonraki otomatik değer davranışını etkileyebileceğinden aktarım sonrasında yeni bir test kaydı ekleyerek sonucu doğrulayın.
Sık yapılan hatalar
- ID’lerin her zaman 1, 2, 3 şeklinde kesintisiz ilerleyeceğini varsaymak.
- Son eklenen kaydı bulmak için
ORDER BY id DESC LIMIT 1sorgusunu kullanmak; eşzamanlı uygulamalarda bu kayıt başka bir istemciye ait olabilir. - AUTO_INCREMENT değerini kullanıcıya görünen güvenlik veya gizlilik kodu olarak kullanmak.
- İlişkili tablolarda
INT,BIGINT, signed ve unsigned türlerini uyumsuz seçmek.
Sık sorulan sorular
AUTO_INCREMENT değerini baştan başlatabilir miyim?
Tablonun sonraki otomatik değerini değiştirmek için
ALTER TABLE ile başlangıç değeri ayarlanabilir. Ancak mevcut kayıtlarla çakışacak veya mevcut sırayı geriye taşıyacak bir değer seçmeyin; üretim tablosunda işlem öncesi mevcut ID aralığını kontrol edin.AUTO_INCREMENT yerine UUID kullanmalı mıyım?
Kimliklerin farklı sistemlerde çakışmaması veya dışarıya tahmin edilmesi zor değerler sunulması gerekiyorsa UUID düşünülebilir. Yalnızca tablo içi, sayısal ve basit bir satır kimliği gerekiyorsa AUTO_INCREMENT genellikle daha doğrudan çözümdür. Seçim, ID’nin kullanıcıya gösterilip gösterilmeyeceği ve sistemlerin birlikte veri üretip üretmeyeceğine göre yapılmalıdır.