SQL'de Otomatik Artan Birincil Anahtar: IDENTITY, AUTO_INCREMENT ve SEQUENCE
Beceri rehberi

SQL'de Otomatik Artan Birincil Anahtar: IDENTITY, AUTO_INCREMENT ve SEQUENCE

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Her yeni satıra veritabanının kendi ürettiği benzersiz bir sayı vermek için her sistemin kendi yöntemi vardır. SQL Server, MySQL ve PostgreSQL'deki tanımları, son üretilen kimliği alma yolunu ve kimlik boşluklarının neden oluştuğunu öğrenirsiniz.

Bir bakışta

  1. Otomatik artan kolon, değeri veritabanının ürettiği anahtar kolonudur. INSERT komutunda bu kolonu atlarsınız; sistem sıradaki değeri verir.
  2. Söz dizimi sisteme göre değişir. SQL Server IDENTITY, MySQL AUTO_INCREMENT, PostgreSQL ise SERIAL ya da standarda uygun GENERATED ... AS IDENTITY kullanır.
  3. Otomatik artış benzersizliği tek başına garanti etmez. Birincil anahtar ya da benzersiz kısıt ayrıca tanımlanmalıdır.
  4. Kimlik değerleri ardışık olmak zorunda değildir. Geri alınan işlemler ve sunucu yeniden başlatmaları numaralarda boşluk bırakabilir; bu hata değil, tasarımdır.
  5. Tablolar arasında ortak sayaç gerekiyorsa SEQUENCE kullanılır. Sayaç tabloya bağlı olmayan ayrı bir nesne olarak tutulur.

Neden veritabanına kimlik ürettirilir?

Bir tabloda satırı güvenle tanımlayacak bir anahtar gerekir. Ad ve soyad tekrar edebilir, e-posta zamanla değişebilir. Bu yüzden çoğu tabloya iş verisinden bağımsız bir kimlik kolonu eklenir ve onu birincil anahtar yaparız. Uygulamanın kimliği kendisi üretmesi yarış durumlarına ve çakışmaya açıktır; farklı kullanıcılar aynı anda aynı sayıyı seçebilir. Değeri veritabanına ürettirmek bu sorunu ortadan kaldırır, çünkü sayaç tek yerde ve eşzamanlı isteklere karşı güvenli tutulur.

Mantık her sistemde aynıdır: kolon tanımına otomatik üretim özelliği verilir, INSERT komutunda kolon listeden çıkarılır ve değer sistem tarafından atanır. Fark söz dizimindedir; sistemlerin yazımları bir sonraki bölümde yan yana verilir.

Bir kimlik kolonunun tek başına birincil anahtar olması gerekmez, ama pratikte o kolona PRIMARY KEY tanımı yazılır. SQL Server belgesi bu konuda açıktır: IDENTITY özelliği değerin benzersizliğini garanti etmez; benzersizliği PRIMARY KEY ya da UNIQUE kısıtı sağlar. Aynı tablo için yalnızca bir kimlik kolonu tanımlanabilir.

SQL Server, MySQL ve PostgreSQL'de tanım

SQL Server'da kolon IDENTITY özelliğiyle tanımlanır. Parantez içinde başlangıç değeri ve artış miktarı verilir; ikisi birlikte yazılır ya da hiç yazılmaz, yazılmazsa varsayılan IDENTITY(1,1) olur:

CREATE TABLE musteri ( musteri_id INT IDENTITY(1,1) PRIMARY KEY, ad VARCHAR(50) );

MySQL'de AUTO_INCREMENT özelliği kullanılır. Kolonun bir anahtar olarak tanımlanması gerekir:

CREATE TABLE musteri ( musteri_id INT NOT NULL AUTO_INCREMENT, ad VARCHAR(50), PRIMARY KEY (musteri_id) );

PostgreSQL'de eski ve yaygın yol SERIAL tipidir. SERIAL gerçek bir tip değil, kısayoldur: arka planda bir sequence yaratır ve kolona varsayılan değer olarak bağlar. SERIAL benzersizlik kısıtı eklemez, PRIMARY KEY ayrıca yazılmalıdır. Standarda uygun yeni biçim ise GENERATED ... AS IDENTITY ifadesidir:

CREATE TABLE musteri ( musteri_id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, ad VARCHAR(50) );

Tipi seçerken tablonun ne kadar büyüyeceğini düşünün. Küçük bir tamsayı tipi sınırına ulaşırsa bir sonraki üretim hata verir; hızla büyüyen olay ve kayıt tablolarında BIGINT tercih edilir.

Şekil 1

Aynı fikir, üç sistemde üç farklı yazım

Otomatik artan kolon tanımları

SQL ServerMySQLPostgreSQL
Kolon özelliğiIDENTITYAUTO_INCREMENTSERIAL ya da GENERATED ... AS IDENTITY
Başlangıç ve artışIDENTITY(1,1) ile verilirTablo özelliği olarak ayarlanırArka plandaki sequence ile ayarlanır
Son üretilen değerSCOPE_IDENTITY ya da OUTPUTLAST_INSERT_ID()INSERT sonunda RETURNING
BenzersizlikPRIMARY KEY ayrıca gerekirKolon anahtar olmalıdırPRIMARY KEY ayrıca gerekir
Kaynak: Microsoft IDENTITY, MySQL AUTO_INCREMENT ve PostgreSQL sayısal tipler belgeleriMindset Institute

Son üretilen kimliği almak ve toplu eklemek

Üst tabloya bir sipariş ekleyip hemen alt tabloya kalemlerini yazacaksanız, az önce üretilen kimliği bilmeniz gerekir. En sık yapılan hata, bunun için tabloda en büyük değeri sorgulamaktır; aynı anda başka bir kullanıcı da satır eklediyse yanlış kimliği alırsınız. Her sistem, bağlantıya özel güvenli bir yol sunar.

MySQL'de LAST_INSERT_ID() çağrısı, o bağlantıda en son otomatik üretilen değeri verir; başka bağlantıların eklemeleri sonucu etkilemez. Birden çok satır tek komutta eklendiyse fonksiyon ilk eklenen satırın değerini döndürür. PostgreSQL'de INSERT sonuna RETURNING musteri_id eklemek, üretilen değeri komutun cevabı olarak getirir. SQL Server'da OUTPUT eki ya da SCOPE_IDENTITY kullanılır.

MySQL'de kimlik kolonuna açıkça bir değer verirseniz sayaç o değerden devam eder: sonraki üretim, kolondaki en büyük değerin bir fazlası olur. Bu yüzden veri taşırken elle büyük bir kimlik girmek sonraki otomatik değerleri de yukarı çeker. SQL Server'da kimlik kolonuna elle değer yazmak için ayrı bir ayar açılması gerekir ve bu işlem veri taşıma gibi özel durumlar içindir.

Kimlikte boşluk oluşması normal mi?

Çoğu geliştirici bir gün kimlik numaralarında boşluk görüp endişelenir. Sistemler bunu bilerek kabul eder. SQL Server belgesi şunları açıkça belirtir: kimlik özelliği bir işlemin aldığı değerlerin ardışık olacağını garanti etmez, sunucu yeniden başlatıldığında ya da bir hata sonrası önbellekteki bazı değerler kaybolabilir ve geri alınan bir eklemenin tükettiği değer bir daha üretilmez. PostgreSQL belgesi de benzer biçimde, hiç satır silinmese bile serial değerlerinde boşluk oluşabileceğini söyler; çünkü sıradan alınan değer, ekleme işlemi geri alınsa bile tüketilmiş sayılır.

Bu nedenle kimlik numarasını sayaç ya da fatura numarası gibi boşluksuz olması gereken bir iş değeri olarak kullanmayın. Yasal olarak ardışık olması gereken belge numaraları için ayrı bir sayaç tablosu ya da kontrollü bir mekanizma tasarlanır; hukuki ve muhasebe gereksinimlerini bu karara dahil edin.

Kimliği sıfırlamak ya da yeniden başlatmak için her sistemin ayrı komutu vardır. Canlı tabloda bunu yapmadan önce mevcut veriyle çakışma olup olmadığını kontrol edin; sayaç, tabloda var olan değerlerin altına inerse benzersiz kısıt hata verir.

SEQUENCE ne zaman gerekir?

Otomatik artan kolon tek tabloya bağlı bir sayaçtır. SEQUENCE ise tablodan bağımsız, adı olan bir nesnedir ve birden çok tablonun ya da uygulamanın aynı sayaçtan beslenmesini sağlar. Örnek olarak farklı kaynaklardan gelen başvuruların hepsinin ortak bir numaralandırma kullanması istenebilir.

PostgreSQL'de bir sequence yaratılır ve nextval fonksiyonuyla sıradaki değer alınır. SERIAL zaten arka planda böyle bir sequence kurar ve onu kolona sahip olarak bağlar: tablo ya da kolon silindiğinde sequence de silinir. SQL Server'da da CREATE SEQUENCE ve NEXT VALUE FOR ile benzer iş yapılır. Her sistemin sequence söz dizimi ve önbellek ayarları farklıdır; kullandığınız sürümün belgesine bakın.

Karar ölçütü basittir: sayaç tek tablonun kimliğiyse otomatik artan kolon yeterlidir. Değer, INSERT'ten önce uygulamada gerekiyorsa ya da tablolar arasında paylaşılıyorsa SEQUENCE seçin. Boşluk kabul edilemeyen belge numaralarında ikisi de tek başına yeterli değildir.

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Mindset'in SQL ile Programlama Eğitimi tablo oluşturma ve kısıt tanımlama adımlarını uygulamalı yapar; Veritabanı Yönetim Sistemleri ve Uygulamaları ise farklı veritabanı sistemlerini yan yana ele alır. Birden çok sistemle çalışan geliştiriciler ve analistler için asıl kazanım, söz dizimi farklarını bilerek taşınabilir şema tasarlamaktır.

Kendi deneme veritabanınızda tabloya kimlik kolonu ekleyip birkaç satırı bilerek geri alarak numaralardaki boşluğu gözlemleyin; teoriyi anlamanın en kısa yoludur.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

Otomatik artan kolon aynı zamanda birincil anahtar mıdır?

Kendiliğinden değildir. IDENTITY, AUTO_INCREMENT ve SERIAL değerin otomatik üretilmesini sağlar, benzersizliği garanti eden ise PRIMARY KEY ya da UNIQUE kısıtıdır. MySQL ayrıca kolonun bir anahtar olarak tanımlanmasını bekler. Pratikte kimlik kolonuna PRIMARY KEY yazılır.

Silinen satırın kimliği yeniden kullanılır mı?

Hayır. Sayaç ilerlemeye devam eder; silinen ya da geri alınan eklemelerin tükettiği değerler yeniden üretilmez ve numaralarda boşluk kalır. Bu davranış bilinçlidir ve performans amacıyla seçilmiştir.

Kimlik kolonuna elle değer yazabilir miyim?

Sisteme göre değişir. MySQL'de açık değer verirseniz sayaç oradan devam eder. SQL Server'da bunun için ayrı bir ayar açmak gerekir. PostgreSQL'de GENERATED ALWAYS biçimi açık değeri reddeder, BY DEFAULT biçimi kabul eder. Elle değer yazmak veri taşıma gibi özel durumlarda yapılmalıdır.

SERIAL mi, GENERATED AS IDENTITY mi kullanmalıyım?

SERIAL eski ve yaygın bir kısayoldur, sequence ile varsayılan değeri kendisi bağlar. GENERATED ... AS IDENTITY standarda uygun yeni biçimdir ve daha açık davranır. Yeni tablolarda yeni biçimi tercih etmek tutarlılık sağlar; mevcut kodda SERIAL de sorunsuz çalışır.

Kimlik değeri tükenir mi?

Evet. Seçilen tamsayı tipinin üst sınırına ulaşıldığında bir sonraki üretim hata verir. Hızla büyüyen tablolarda baştan BIGINT seçmek bu riski ortadan kaldırır. Tipi sonradan büyütmek mümkündür ama büyük tablolarda zaman alır.

SQL Otomatik Artan ID: IDENTITY, AUTO_INCREMENT, SERIAL