İçeriğe geç

Menü

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

PostgreSQL’de Otomatik Artan id Nasıl Oluşturulur? IDENTITY Kullanımı

postgresql-auto-increment-identity-kullanimi
Bu yazıda neler var?
  1. PostgreSQL'de otomatik artan id nasıl tanımlanır?
  2. GENERATED ALWAYS ile öğrenci tablosu oluşturma
  3. ALWAYS ve BY DEFAULT arasındaki fark nedir?
  4. SERIAL ve sequence ne işe yarar?
  5. Silinen kayıtlardan sonra id neden boşluklu ilerler?

PostgreSQL’de otomatik artan id oluşturmak için tablo tanımında GENERATED ALWAYS AS IDENTITY kullanabilirsin. Bu yapı, yeni kayıt eklenirken değeri PostgreSQL tarafından üretilen bir kimlik sütunu oluşturur ve MySQL’deki AUTO_INCREMENT yaklaşımına karşılık gelir.

PRIMARY KEY, tablodaki her kaydı benzersiz biçimde tanımlar. PostgreSQL’de MySQL’e ait AUTO_INCREMENT sözdizimini kullanırsan bu ifade PostgreSQL söz diziminin parçası olmadığı için hata alırsın; bunun yerine IDENTITY tanımı yapılmalıdır. PostgreSQL CREATE TABLE belgelerinde otomatik değer üretimi için GENERATED ALWAYS AS IDENTITY ve GENERATED BY DEFAULT AS IDENTITY biçimleri gösterilir.

PostgreSQL'de otomatik artan id nasıl tanımlanır?

Otomatik artan bir kimlik için sütun veri tipinden sonra GENERATED ALWAYS AS IDENTITY ifadesini, ardından da PRIMARY KEY kısıtını yazabilirsin. PostgreSQL bu tanımla birlikte sütuna bağlı bir sequence oluşturur ve yeni kayıtlarda uygun değeri otomatik olarak üretir. Sequence, sayısal değerleri belirli bir sırayla üreten veritabanı nesnesidir.

CREATE TABLE urunler (
    id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    ad text NOT NULL
);

Bu tabloda kayıt eklerken id sütununu belirtmen gerekmez. PostgreSQL, yeni satır için kimlik değerini kendisi oluşturur. id alanını ayrıca NOT NULL olarak yazmak da gerekmez; identity sütunu bu özelliği kendiliğinden taşır.

GENERATED ALWAYS ile öğrenci tablosu oluşturma

GENERATED ALWAYS ile öğrenci tablosu oluşturma

GENERATED ALWAYS kullanıldığında id değerini normal bir INSERT komutuyla elle vermek yerine PostgreSQL’in üretmesine izin verirsin. Aşağıdaki örnekte tablo oluşturma, iki kayıt ekleme, ikinci kaydın oluşturulan kimliğini RETURNING id ile alma ve kayıtları id değerine göre sıralama aynı veri akışı üzerinde gösterilmiştir.

CREATE TABLE ogrenciler (
    id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    ad text NOT NULL,
    sinif integer NOT NULL
);

INSERT INTO ogrenciler (ad, sinif)
VALUES ('Elif', 10);

INSERT INTO ogrenciler (ad, sinif)
VALUES ('Mert', 11)
RETURNING id;

SELECT id, ad, sinif
FROM ogrenciler
ORDER BY id;

Yeni oluşturulan tabloda ilk kayıt için id değeri 1, ikinci kayıt için 2 olur. RETURNING id ifadesi, ikinci INSERT işleminden sonra üretilen kimliği sonuç olarak döndürür. PostgreSQL belgelerinde INSERT ... RETURNING yapısının eklenen satırın yeni değerlerini döndürebildiği açıklanır.

 id
----
  2
(1 row)

 id |  ad   | sinif
----+-------+-------
  1 | Elif  |    10
  2 | Mert  |    11
(2 rows)

ORDER BY id kullanıldığı için sonuçlar kimlik değerine göre küçükten büyüğe sıralanır. INSERT komutlarında id sütununu listeye eklememek, identity sütununun otomatik değer üretmesini sağlar.

ALWAYS ve BY DEFAULT arasındaki fark nedir?

ALWAYS ve BY DEFAULT arasındaki fark nedir?

GENERATED ALWAYS ve GENERATED BY DEFAULT seçenekleri, INSERT sırasında id sütununa elle değer verildiğinde PostgreSQL’in nasıl davranacağını belirler. ALWAYS kullanıldığında id değeri normal koşullarda identity mekanizması tarafından üretilir. BY DEFAULT kullanıldığında ise id belirtilmişse kullanıcının verdiği değer öncelikli olur, id belirtilmemişse sequence üzerinden yeni bir değer atanır.

Birincil anahtar, tablodaki her satırı benzersiz biçimde tanımlayan ve aynı değerin birden fazla satırda kullanılmasını engelleyen kısıtlamadır. Identity özelliği otomatik değer üretir, ancak sütunun birincil anahtar olması için ayrıca PRIMARY KEY kısıtlaması eklenmelidir.

CREATE TABLE ogrenciler (
    id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    ad_soyad text NOT NULL
);

INSERT INTO ogrenciler (id, ad_soyad)
VALUES (100, 'Ayşe Yılmaz');

Bu INSERT sorgusu hata ile sonuçlanır. Çünkü GENERATED ALWAYS tanımlı sütunda açıkça verilen id değeri, özel bir geçersiz kılma seçeneği kullanılmadan kabul edilmez. Böyle bir değer eklemek gerektiğinde OVERRIDING SYSTEM VALUE ifadesi, sequence tarafından üretilecek değerin yerine sorgudaki değerin kullanılmasını sağlar.

INSERT INTO ogrenciler (id, ad_soyad)
OVERRIDING SYSTEM VALUE
VALUES (100, 'Ayşe Yılmaz')
RETURNING id, ad_soyad;

Beklenen çıktı:

 id  |  ad_soyad
-----+------------
 100 | Ayşe Yılmaz

BY DEFAULT seçeneğinde açık id değeri doğrudan kullanılabilir. Aşağıdaki tablo ve ekleme sorgusu birbirinden bağımsız çalışır:

CREATE TABLE ogrenciler_default (
    id integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    ad_soyad text NOT NULL
);

INSERT INTO ogrenciler_default (id, ad_soyad)
VALUES (500, 'Mehmet Kaya')
RETURNING id, ad_soyad;

Bu sorguda sonuç olarak 500 değeri döner. Aynı tabloya id sütununu belirtmeden kayıt eklersen PostgreSQL, değeri identity sütununa bağlı sequence üzerinden üretir.

SERIAL ve sequence ne işe yarar?

SERIAL, PostgreSQL’in otomatik artan sütun oluşturmak için sunduğu pratik bir yazım kısaltmasıdır. Gerçekte integer bir sütun, bu sütun için varsayılan değer üreten bir nextval() ifadesi ve sütuna bağlı bir sequence oluşturulmasını sağlar. SERIAL kullanmak tek başına sütunu birincil anahtar yapmaz.

CREATE TABLE eski_ogrenciler (
    id SERIAL PRIMARY KEY,
    ad_soyad text NOT NULL
);

INSERT INTO eski_ogrenciler (ad_soyad)
VALUES ('Zeynep Demir')
RETURNING id, ad_soyad;

Yeni oluşturulan bu tabloda id sütunu belirtilmediği için değer sequence üzerinden atanır ve ilk kayıt için varsayılan başlangıç değeri kullanılır:

 id |  ad_soyad
----+------------
  1 | Zeynep Demir

Sequence, art arda sayısal değerler üreten özel bir veritabanı nesnesidir; nextval() çağrısı sequence’in sıradaki değerini verir. SERIAL bu nesneyi ve varsayılan değeri arka planda oluştururken, IDENTITY sütun tanımının parçası olan ayrı bir otomatik üretim özelliğidir. İki yaklaşım sequence kullansa da tamamen aynı sözdizimsel ve şema yönetimi mekanizması olarak değerlendirilmemelidir. Identity sütunları PostgreSQL 10 sürümünde eklenmiş ve SERIAL için SQL standardına daha yakın bir seçenek olarak sunulmuştur.

Silinen kayıtlardan sonra id neden boşluklu ilerler?

Silinen bir kaydın id değerinin otomatik olarak yeniden kullanılmasını beklememek gerekir. Birincil anahtar, satırı diğer satırlardan ayırt eden kalıcı bir kimlik olarak kullanıldığı için numaraların arka arkaya ilerlemesi zorunlu değildir.

Önceki ogrenciler örneğinde id değerlerinin 1, 2 ve 3 olduğunu düşünelim. 2 numaralı öğrenci silindikten sonra yeni bir kayıt eklenirse PostgreSQL, boşalan 2 değerine dönmek yerine sequence üzerinden sıradaki değeri üretir.

DELETE FROM ogrenciler
WHERE id = 2;

INSERT INTO ogrenciler (ad)
VALUES ('Deniz');

SELECT id, ad
FROM ogrenciler
ORDER BY id;

Sorgunun sonucu, önceki kayıtların adlarına bağlı olarak aşağıdaki sıra mantığını gösterir:

 id
----
  1
  3
  4

Buradaki 2 numarasının bulunmaması bir hata değildir. Sequence, yeni sayısal değerler üreten bir veritabanı nesnesidir ve bir işlem iptal edildiğinde alınmış değer otomatik olarak geri verilmez. Örneğin bir INSERT işlemi sequence değerini aldıktan sonra ROLLBACK ile iptal edilirse, aynı değer sonraki kayıtta yeniden kullanılmayabilir. Bu davranış, eş zamanlı işlemler sırasında aynı numaranın birden fazla kayda verilmesini önlemeye yardımcı olur.

Bu nedenle id değerlerindeki boşlukları kapatmak için kayıtları yeniden numaralandırmak risklidir. Başka tablolardaki foreign key ilişkileri, raporlar veya dış sistemlerde saklanan kimlikler eski değerlere bağlı kalabilir. Sıralı görünen numaralar gerekiyorsa bunu birincil anahtarı değiştirerek değil, gösterim amacıyla ayrı bir numaralandırma mantığıyla ele almak daha güvenlidir.

Otomatik artan id alanı, kayıtların anlamlı bir sıra numarasını değil, benzersiz kimliğini tutar. Bu yüzden silme veya iptal sonrasında oluşan boşluklar normal kabul edilir.

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