Otomatik Sütun Değerleri Üretmek – Bölüm 24

Bu bölümde, sütun değerleri şeklinde kullanmak üzere sayı dizisi üretmeyi öğreneceğiz.

IDENTITY Kullanımı

Tablodaki bir sütun için otomatik olarak ardışık değerler oluşturmak  gerekebiliyor. SQL Server’da bu değerleri üretmek için iki yol bulunmaktadır:

  • IDENTITY özelliği (tüm SQL Server sürümleri için)
  • SQL Server 2012 ve sonraki sürümlerde ardışıklık nesnesi

Her iki yol da satırlar tabloya eklendiğinde ardışıklık kazandırmak için kullanılabilir. Bu ardışık değişken, birden çok tabloda verimli bir şekilde kullanılabilir.

IDENTITY özelliğini kullanmak için 0 ölçekli (tam sayı olduğunu belirtir) sayısal bir veri türü kullanarak bir sütun tanımlayın ve IDENTITY kelimesini ekleyin.

İsteğe bağlı bir seed (başlangıç değeri) ve bir artış değeri (adım değeri) de belirtilebilir. Belirtilmezse ikisi de 1 olarak atanacaktır

Bir tabloda sadece bir sütunda IDENTITY kullanılabilir. Alternatif bir primary key olması da alışılmış bir durumdur.

Aşağıdaki kod parçasında IDENTITY özelliği tanımlanmış bir EmployeeID sütununu, seed 100 ve artış 10 atanmış şekilde bir değer gösterilmektedir:

CREATE TABLE Employee
(
EmployeeID int IDENTITY(100, 10) NOT NULL
, …
)

Bir sütunda IDENTITY özelliği tanımlandığında, tabloya INSERT ifadeleri IDENTITY sütununa referans tutamaz. SQL Server, insert işlemi gerçekleştirirken bu sütun içerisinde bir sonraki değeri kullanarak bir değer üretir. Bir IDENTITY sütununa açıkça bir değer atanması gerekiyorsa, IDENTITY sütununun varsayılan davranışını SET IDENTITY INSERT ifadesi ile geçersiz kılmak gerekir.

IDENTITY ile bir sütuna bir değer atandığında, bu değerler de sorgularda çekilebilir. Bir tabloda, IDENTITY tarafından üretilen değerler benzersizdir. Bununla birlikte, sütun üzerinde herhangi bir kısıtlama olmaksızın değer üretildikten sonra benzersizlik (uniqueness) uygulanmaz.

Aynı session ve scope (stored procedure gibi) içinde en son atanan değeri döndürmek için SCOPE_IDENTITY () fonksiyonu kullanılabilir. Eski @@IDENTITY fonksiyonu, bir session sırasında oluşturulan son değeri döndürür, fakat scope ayırt etmez. SCOPE_IDENTITY () fonksyonu çoğu amaç için kullanılabilir.

IDENTITY özelliğini sıfırlamak için yeni bir seed atayarak DBCC CHECKIDENT ifadesini kullanabilirsiniz.

IDENTITY_CACHE

SQL Server 2017’deki yeni gelen bir özellikle, identity cache etkinleştirilebilir veya devre dışı bırakılabilir. Bu özellik varsayılan olarak etkindir ve identity sütunlarına sahip tablolar için INSERT ifadesinin performansını artırır.

Bir sunucu yeniden başlatıldığında veya başka bir sunucuya failover olduğunda numaralandırmadaki boşlukları önlemek istiyorsanız, IDENTITY_CACHE öğesini OFF olarak ayarlayın. Tabii diğer nedenlerden dolayı bu boşluklar yine olabilir.

IDENTITY_CACHE ayarını değiştirmek için ALTER DATABASE SCOPED CONFIGURATION öğesini kullanabilirsiniz.

ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE=ON;
Ardışık Dizileri Kullanmak

Öğrendiğimiz üzere, IDENTITY özelliği tablo içinde bir sütun için bir dizi değer oluşturmak için kullanılır. Ancak, IDENTITY özelliği, bir veritabanı içindeki birden çok tablodaki değerleri koordine etmek için uygun değildir. Veritabanı yöneticileri ve geliştiricilerinin, tablolar arasında sıralı değerlerin bir havuzunu sağlamak için el ile sayı tabloları oluşturmaları gerekir.

SQL Server 2012’de IDENTITY özelliğinden daha esnek olan ve bir veri tabanı içindeki birden çok tablo tarafından referans tutulan bağımsız bir veri tabanı nesnesi olan yeni ardışık dizi nesnesini sağlar. Bu dizi nesnesi, CREATE, ALTER ve DROP gibi tipik veri tanımlama dili (DDL) ifadeleriyle oluşturulur ve kullanılır. SQL Server, bir INSERT ifadesi veya bir sütun tanımındaki varsayılan bir kısıtlama gibi bir sıradaki sonraki değeri almak için bir komut sağlar.

Bir ardışık sıra tanımlamak için, isteğe bağlı olarak veri türünü (tamsayı tipinde veya 0 ölçekli ondalık/sayı olmalıdır), başlangıç, artış ve maksimum değeri ve ilgili diğer seçenekleri de tanımlamak için CREATE SEQUENCE ifadesini kullanın.

Bir sonraki kullanılabilir sıra değerini almak için NEXT VALUE FOR fonksiyonunu kullanın. Bir seferde birden çok sıra numarası döndürmek için sp_sequence_get_range sistem prosedürünü kullanın.

Aşağıdaki sorguda, örnek bir tabloya INSERT işlemine değer sağlamak için bir sıra değeri döndürmektedir:

CREATE SEQUENCE dbo.demoSequence
 AS INT
 START WITH 1
 INCREMENT BY 1;
GO
CREATE TABLE dbo.tblDemo
 (SeqCol int PRIMARY KEY,
 ItemName nvarchar(25) NOT NULL);
GO
INSERT
 INTO dbo.tblDemo (SeqCol,ItemName)
 VALUES (NEXT VALUE FOR dbo.demoSequence, 'Item');
GO

Tabloya select sorgusu attığımızda yeni eklenen kayda bir sıra değerinin eklendiğini göreceksiniz.

Kaynak:
SET IDENTITY_INSERT (Transact-SQL)
ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL)
CREATE SEQUENCE (Transact-SQL)

Leave a Reply

Your email address will not be published. Required fields are marked *