MySQL AUTO_INCREMENT, yeni eklenen satırlar için otomatik olarak artan kimlik değerleri üretir. Bu değerler genellikle tablodaki satırları ayırt etmek için kullanılan PRIMARY KEY sütununda tutulur. Böylece her kayıt için kimlik sayısını elle belirlemek gerekmez.
Birincil anahtar, aynı tabloda tekrarlanmaması beklenen ve satırları birbirinden ayırt eden sütundur. Sayaç ise yeni kayıtlar için üretilecek bir sonraki otomatik kimlik değerini takip eder. PostgreSQL ve SQLite da otomatik kimlik üretimi için kendi sözdizimlerini kullanır, ancak bu yazı MySQL'deki AUTO_INCREMENT kullanımına odaklanır.
AUTO_INCREMENT nedir ve PRIMARY KEY ile nasıl tanımlanır?
AUTO_INCREMENT, bir tamsayı sütununa yeni satır eklendiğinde MySQL'in artan bir kimlik değeri üretmesini sağlar. Sütun aynı zamanda PRIMARY KEY olarak tanımlandığında, üretilen kimlikler satırların benzersiz biçimde ayırt edilmesine yardımcı olur. MySQL'de AUTO_INCREMENT sütununun indeksli olması gerekir; PRIMARY KEY tanımı bu gereksinimi karşılar.
Aşağıdaki tabloda id sütunu hem otomatik artan hem de birincil anahtardır. ad ve bolum sütunları kayıtla ilgili bilgileri taşırken, id her öğrenciyi ayırt eder.
CREATE TABLE ogrenciler (
id INT AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(100) NOT NULL,
bolum VARCHAR(100) NOT NULL
);
Bu tanımda yeni bir kayıt eklenirken id değerini belirtmezsen MySQL uygun bir sonraki değeri üretir. Bir tabloda AUTO_INCREMENT özelliği taşıyan sütun için tamsayı türü kullanılır ve bu özellik aynı tabloda tek bir sütuna verilebilir.
INSERT sırasında kimlik sütunu nasıl otomatik doldurulur?

Kimlik sütununu INSERT komutundaki sütun listesine eklemeden kayıt oluşturabilirsin. MySQL, id sütununu dışarıda bıraktığında AUTO_INCREMENT sayacını kullanır ve her satıra otomatik bir değer atar.
INSERT INTO ogrenciler (ad, bolum)
VALUES
('Ayşe', 'Bilgisayar Programcılığı'),
('Mert', 'Elektrik Elektronik'),
('Selin', 'Matematik');
Tablo daha önce boşsa sonuç aşağıdaki gibi olabilir:
| id | ad | bolum |
|---|---|---|
| 1 | Ayşe | Bilgisayar Programcılığı |
| 2 | Mert | Elektrik Elektronik |
| 3 | Selin | Matematik |
id sütununa elle değer vermek bazı durumlarda gerekli olabilir, ancak dikkat ister. Verilen değer tabloda zaten varsa PRIMARY KEY çakışması oluşabilir. Yeni bir değer elle eklendiğinde ise sonraki otomatik değerin sırası, tabloda bulunan en yüksek kimliğe göre ilerleyebilir. Bu nedenle özel bir gereksinim yoksa kimlik değerini MySQL'in üretmesine izin vermek daha güvenlidir.
Tek satırlı bir eklemeden sonra oluşturulan kimliği öğrenmek için LAST_INSERT_ID() kullanılabilir:
INSERT INTO ogrenciler (ad, bolum)
VALUES ('Deniz', 'Fizik');
SELECT LAST_INSERT_ID() AS yeni_id;
| yeni_id |
|---|
| 4 |
LAST_INSERT_ID(), otomatik üretilen kimlik bilgisini aynı veritabanı bağlantısı kapsamında döndürür. Başka bir bağlantının yaptığı ekleme, senin bağlantındaki değeri değiştirmez. Çok satırlı bir INSERT işleminde ise fonksiyon, o işlemde başarıyla üretilen ilk otomatik kimlik değerini döndürür.
Silinen kayıtlardan sonra neden kimlik boşlukları oluşur?

AUTO_INCREMENT sütununda oluşan boşluklar, silinen satırların kimlik değerlerinin otomatik olarak geri alınmamasından kaynaklanır. Kimlik sütunu genellikle kayıtların kalıcı sıra numarası olarak değil, her satırı diğerlerinden ayıran bir tanımlayıcı olarak kullanılır.
Aşağıdaki örnekte üç kayıt ekleniyor, ardından id değeri 2 olan kayıt siliniyor. Yeni kayıt eklendiğinde MySQL, silinen 2 değerini kendiliğinden yeniden kullanmak yerine sonraki kimlik değerini verir.
CREATE TABLE kullanicilar (
id INT AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(100) NOT NULL
) ENGINE = InnoDB;
INSERT INTO kullanicilar (ad)
VALUES ('Ayşe'), ('Berk'), ('Cem');
DELETE FROM kullanicilar
WHERE id = 2;
INSERT INTO kullanicilar (ad)
VALUES ('Deniz');
SELECT id, ad
FROM kullanicilar
ORDER BY id;
InnoDB tablolarında otomatik olarak tahsis edilen değerler, ilgili satır daha sonra silinse veya işlem geri alınsa bile yeniden kullanılmaz. Bu nedenle yeni kayıt, silinen 2 yerine 4 kimliğini alır.
| id | ad |
|---|---|
| 1 | Ayşe |
| 3 | Cem |
| 4 | Deniz |
Buradaki 1, 3 ve 4 değerleri, kayıtların eklenme sürecini ve mevcut kimliklerini gösterir. Kimliklerin 1, 2, 3, 4 şeklinde kesintisiz görünmesi gerekmiyorsa bu boşluklar normaldir. Faturaların sıra numarası veya kullanıcıların görünen sıra bilgisi gibi kesintisiz bir numaralandırmaya ihtiyaç duyulan durumlarda, AUTO_INCREMENT sütununu bu amaçla kullanmak yerine ayrı bir sıralama mantığı tasarlamak gerekir.
ALTER TABLE, DELETE ve TRUNCATE sayacı nasıl etkiler?
ALTER TABLE ... AUTO_INCREMENT = N sözdizimi, yeni otomatik kimliklerin hangi değerden başlamasının istendiğini belirtir. Örneğin tabloda en büyük id değeri 4 ise aşağıdaki komuttan sonra yeni otomatik değer 10 olur.
ALTER TABLE kullanicilar
AUTO_INCREMENT = 10;
Belirlenen değer, tabloda bulunan en büyük kimlik değerinden küçük veya ona eşitse MySQL sayacı bu değeri doğrudan kullanmaz. Mevcut en büyük kimlik değerinin sonrasındaki değeri dikkate alır. Bu nedenle silinen kayıtların oluşturduğu boşlukları yalnızca sayaç ayarıyla güvenilir biçimde doldurmak mümkün değildir.
| Komut | Satır durumu | AUTO_INCREMENT davranışı |
|---|---|---|
DELETE ... WHERE ... |
Seçilen satırlar silinir. | InnoDB’de daha önce tahsis edilen kimlikler otomatik olarak yeniden kullanılmaz. |
ALTER TABLE ... AUTO_INCREMENT = N |
Satırlar korunur. | N, mevcut en büyük kimlikten büyükse sonraki otomatik değer olarak kullanılabilir. |
TRUNCATE TABLE |
Tablodaki tüm satırlar kaldırılır. | AUTO_INCREMENT sayacı başlangıç değerine döner. |
DELETE FROM kullanicilar
WHERE id = 3;
TRUNCATE TABLE kullanicilar;
DELETE belirli satırları kaldırmak için kullanılır ve kimlik sayacını normal olarak başlangıç noktasına taşımaz. TRUNCATE TABLE ise tabloyu boşaltırken AUTO_INCREMENT değerini başlangıç değerine sıfırlar; bu nedenle geliştirme ortamında test verilerini tamamen temizlemek için farklı bir sonuç üretir.
AUTO_INCREMENT kullanımında hangi hatalardan kaçınmalısın?
AUTO_INCREMENT kullanırken üç hataya özellikle dikkat etmelisin: kimlik sütununa gereksiz yere elle değer yazmak, silinen kimlikleri yeniden sıralamaya çalışmak ve sütunu uygun bir anahtar olarak tanımlamamak.
- Kimlik değerini gereksiz biçimde elle verme: Normal ekleme işlemlerinde kimlik sütununu
INSERTsorgusuna dahil etmemen daha güvenlidir. Elle verilen değerler sayaç davranışını etkileyebilir ve mevcut kayıtlarla çakışabilir. Özel bir veri aktarımı yapılmadığı sürece aşağıdaki kullanım daha uygundur:
INSERT INTO kullanicilar (ad)
VALUES ('Deniz');
SELECT LAST_INSERT_ID();
- Silinen kimlikleri yeniden sıralamaya çalışma: Bir kayıt silindiğinde oluşan boşluk, veritabanı açısından hata değildir. Eski kimlikleri değiştirerek 1, 2, 3 şeklinde kesintisiz bir sıra oluşturmaya çalışmak, başka tablolardaki ilişkileri ve dış sistemlerde saklanan kimlikleri bozabilir. Kimlik değerlerini raporlama sırası, ekranda gösterim sırası veya kesintisiz numara beklentisi için kullanmamalısın.
- Kimlik sütununu anahtar olarak tanımlamayı unutma: Kimlik sütunu için çoğu tasarımda
PRIMARY KEYkullanılır. Tasarımın gerektirdiği durumda uygun birUNIQUEtanımlaması da değerlendirilebilir. Böylece kayıtların tekil olarak bulunması ve tablolar arası ilişkilerin kurulması daha sağlıklı olur. MySQL belgeleri de AUTO_INCREMENT sütununun bir indeks içinde tanımlanmasını ve kimliklerin benzersiz tutulması için PRIMARY KEY veya UNIQUE kullanılmasını önerir.
Sıralama gerekiyorsa kimlik sütununa güvenmek yerine oluşturulma zamanını tutan ayrı bir alanı, örneğin olusturulma_tarihi sütununu, kullanım amacına göre değerlendirebilirsin. PostgreSQL benzer ihtiyaçlar için SERIAL veya IDENTITY özelliklerini, SQLite ise INTEGER PRIMARY KEY ve gerektiğinde AUTOINCREMENT yaklaşımını kullanır.
Sık Sorulan Sorular
AUTO_INCREMENT ile PRIMARY KEY aynı şey midir?
AUTO_INCREMENT yeni kayıtlar için otomatik kimlik değeri üretir, PRIMARY KEY ise bir tablodaki her kaydı tekil biçimde tanımlar. İki özellik farklı görevler üstlenir ve aynı sütunda birlikte kullanılabilir.
INSERT sorgusunda AUTO_INCREMENT sütununu yazmak zorunda mıyım?
INSERT sorgusunda AUTO_INCREMENT sütununu yazmak zorunda değilsin; sütunu sorgudan çıkardığında MySQL uygun değeri kendisi üretir. Oluşturulan değeri aynı bağlantı içinde SELECT LAST_INSERT_ID(); sorgusuyla alabilirsin.
DELETE ile silinen AUTO_INCREMENT değerleri yeniden kullanılır mı?
DELETE ile silinen AUTO_INCREMENT değerleri, özellikle InnoDB tablolarında, otomatik olarak yeniden kullanılmaz. Bu nedenle silme işlemlerinden sonra kimliklerde boşluk oluşması normaldir ve eski kayıtların kimliklerini değiştirmek yerine bu boşluklar olduğu gibi bırakılmalıdır.
TRUNCATE ile DELETE arasında AUTO_INCREMENT sayacı açısından ne fark vardır?
DELETE belirli kayıtları koşula göre siler ve sayaç için genel olarak yeni bir başlangıç oluşturmaz. TRUNCATE TABLE ise tabloyu tamamen boşaltır ve AUTO_INCREMENT değerini başlangıç değerine döndürür; bu yüzden iki komut aynı sonucu vermez.
LAST_INSERT_ID() hangi kimlik değerini döndürür?
LAST_INSERT_ID(), aynı bağlantı içinde AUTO_INCREMENT sütununa başarılı bir INSERT işlemiyle üretilen en son kimliği döndürür. Tek sorguda birden fazla satır eklenirse ilk eklenen satır için üretilen kimlik döndürülür.
AUTO_INCREMENT, kayıtları birbirinden ayırmak için kullanışlı bir araçtır; ancak raporlama sırası, zaman bilgisi veya kesintisiz numara ihtiyacı için ayrı alanlar tasarlamak daha doğru sonuç verir.