ProgramlamaSQL mühendis / Veri mimarı

SQL'de otomatik olarak benzersiz anahtarlar oluştururken SEQUENCE/IDENTITY'nin sıra üretimi ve işlenmesi nasıl çalışır ve temel olarak nasıl farklılık gösterir? Hangi potansiyel sorunlar ortaya çıkabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

SEQUENCE (örneğin, PostgreSQL ve Oracle'da) — mevcut değeri saklayan ve ekleme için benzersiz sayılar sağlayan özel bir veritabanı nesnesidir (genellikle anahtarlar için). IDENTITY — ekleme sırasında sırayla bir sonraki değeri otomatik olarak atayan bir alan özelliğidir (SQL Server, MySQL, PostgreSQL'de tablo otomatik artış).

Anahtar farklar:

  • SEQUENCE — tablodan bağımsız bir nesnedir, farklı yerlerden erişilebilir, ekleme olmadan bir sonraki değeri almak mümkündür (nextval / currval). Farklı tablolar için kullanılabilir, bir tablo için birden fazla SEQUENCE olabilir.
  • IDENTITY — sütunun tanımının bir parçasıdır, yalnızca bir satır eklendiğinde otomatik olarak artar.

Örnek:

-- PostgreSQL SEQUENCE CREATE SEQUENCE order_seq; INSERT INTO orders(id, name) VALUES (nextval('order_seq'), 'İlk Sipariş'); -- PostgreSQL IDENTITY CREATE TABLE users ( id BIGSERIAL PRIMARY KEY, username TEXT ); INSERT INTO users(username) VALUES ('ivan'); -- id otomatik olarak atanacak

Sorunlar ve incelikler:

  • Eğer manuel olarak id eklenirse, "delikler" veya çakışmalar olabilir.
  • Satır silme durumunda — değerler yeniden kullanılmaz, anahtar aralığında bir kesinti olabilir.
  • Bazı DBMS'lerde (örneğin, MySQL) işlem geri alındığında otomatik artış "ilerleyebilir" ve değeri değiştirilmemiş bırakabilir.
  • SEQUENCE, birden fazla tabloda kullanılabilir, ancak bu benzersizliğin korunmasını zorlaştırır.

Kandırmaca Soru

Eğer aynı anda iki sorgu bir SEQUENCE'ten nextval() talep ederse ne olur? Tekrarlanan değerler elde etmek mümkün mü?

Cevap: Hayır, SEQUENCE benzersizliği garanti eder. Her sorgu, eşzamanlı erişim olsa bile benzersiz bir değer alır. Ancak sıra, paralellik nedeniyle ekleme sırasına uymayabilir.

Örnek:

-- İlk işlem nextval=100'ü alır, ikincisi hemen ardından nextval=101'i alır. -- İlk işlem geri alırsa bile, 100 değeri zaten kullanılmıştır.

Hikaye #1

Veritabanı MySQL'den PostgreSQL'e taşındığında SEQUENCE ve IDENTITY arasındaki farkları unuttular: id'leri manuel olarak eklemeye çalıştılar ve otomatik üretimde "duplicate key" hatası aldılar. Anahtar yönetimini tamamen SEQUENCE'a taşıyarak düzeltildi.


Hikaye #2

Otomatik artışa sahip tablodaki satırların kısmi silinmesi durumunda, bir kez id aralığını "sıkı" doldurmak istedim. Kontrolsüz yeni satır oluşturma nedeniyle belirsizlikler ortaya çıktı — anahtarlar iş mantığı ile tutarsız hale geldi, kontrol için ayrı bir SEQUENCE'e geçmek gerekti.


Hikaye #3

Büyük bir OLTP sisteminde SEQUENCE üzerinde kontrol eksikliği nedeniyle sipariş numarası 2,147,483,647'yi geçerek entegre API'de acil bir arıza neden oldu, çünkü bigint değerlerine hazır değildi. Sorgu, SEQUENCE için kontrol edici üst sınır değerleri ile yeniden uygulandı.