İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Özel Ders Başvuru Ücretsiz ön görüşme Ana Sayfa

MySQL AUTO_INCREMENT Nasıl Kullanılır? Otomatik Artan Kimlik Sütunu

mysql-auto-increment-nasil-kullanilir-otomatik-artan-kimlik-sutunu
Bu yazıda neler var?
  1. AUTO_INCREMENT nedir ve PRIMARY KEY ile nasıl tanımlanır?
  2. INSERT sırasında kimlik sütunu nasıl otomatik doldurulur?
  3. Silinen kayıtlardan sonra neden kimlik boşlukları oluşur?
  4. ALTER TABLE, DELETE ve TRUNCATE sayacı nasıl etkiler?
  5. AUTO_INCREMENT kullanımında hangi hatalardan kaçınmalısın?
  6. Sık Sorulan Sorular

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?

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?

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 INSERT sorgusuna 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 KEY kullanılır. Tasarımın gerektirdiği durumda uygun bir UNIQUE tanı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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara