Otomatik değerler oluşturma

Tamamlandı

Belirli bir tablodaki bir sütun için otomatik olarak sıralı değerler oluşturmanız gerekebilir. Transact-SQL bunu yapmak için iki yol sağlar: IDENTITY özelliğini bir tablodaki belirli bir sütunla kullanın veya SEQUENCE nesnesi tanımlayıp bu nesne tarafından oluşturulan değerleri kullanın.

IDENTITY özelliği

IDENTITY özelliğini kullanmak için, 0 ölçeğine sahip bir sayısal veri türü kullanarak bir sütun tanımlayın (yalnızca tamsayılar anlamına gelir) ve IDENTITY anahtar sözcüğünü ekleyin. İzin verilebilen türler, açıkça 0 ölçeğini verdiğiniz tüm tamsayı türlerini ve ondalık türleri içerir.

İsteğe bağlı bir çekirdek (başlangıç değeri) ve bir artış (adım değeri) de belirtilebilir. Tohum ve artış dışında bırakılarak her ikisi de 1 olarak ayarlanır.

Dekont

IDENTITY özelliği, sütun tanımında NULL veya NOT NULL belirtilmesi yerine belirtilir. IDENTITY özelliğine sahip herhangi bir sütun otomatik olarak null atanamaz. YALNıZCA kendi kendine belgeler için NOT NULL belirtebilirsiniz, ancak sütunu NULL (null atanabilir anlamına gelir) olarak belirtirseniz, tablo oluşturma deyimi bir hata oluşturur.

Bir tablodaki yalnızca bir sütunda IDENTITY özelliği ayarlanmış olabilir; genellikle BİRİnCİl ANAHTAR veya alternatif anahtar olarak kullanılır.

Aşağıdaki kod, önceki bölüm örneklerinde kullanılan Sales.Promotion tablosunun oluşturulmasını gösterir, ancak bu kez birincil anahtar olarak PromotionID adlı bir kimlik sütunuyla gösterilir:

CREATE TABLE Sales.Promotion
(
PromotionID int IDENTITY PRIMARY KEY,
PromotionName varchar(20),
StartDate datetime NOT NULL DEFAULT GETDATE(),
ProductModelID int NOT NULL REFERENCES Production.ProductModel(ProductModelID),
Discount decimal(4,2) NOT NULL,
Notes nvarchar(max) NULL
);

Dekont

CREATE TABLE deyiminin tüm ayrıntıları bu modülün kapsamı dışındadır.

Kimlik sütununa veri ekleme

Bir sütun için IDENTITY özelliği tanımlandığında, tabloya INSERT deyimleri genellikle IDENTITY sütunu için bir değer belirtmez. Veritabanı altyapısı, sütun için bir sonraki kullanılabilir değeri kullanarak bir değer oluşturur.

Örneğin, Sales.Promotion tablosuna PromotionID sütunu için bir değer belirtmeden bir satır ekleyebilirsiniz:

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.10, '10% discount')

VALUES yan tümcesi PromotionID sütunu için bir değer içermese de INSERT yan tümcesinde sütun listesi belirtmeniz gerekmemesine dikkat edin- Kimlik sütunları bu gereksinimden muaftır.

Bu satır tabloya eklenen ilk satırsa, sonuç aşağıdaki gibi yeni bir satırdır:

Promosyon Kimliği

PromotionName

StartDate

Productmodelıd

İndirim

Notlar

1

Tasfiye Satışı

2021-01-01T00:00:00

23

0,1

%10 indirim

Tablo oluşturulduğunda, IDENTITY sütunu için hiçbir tohum veya artış değeri ayarlanmamıştır, bu nedenle ilk satır 1 değeriyle eklenir. Eklenecek sonraki satıra 2 PromotionID değeri atanır ve bu şekilde devam eder.

Kimlik değeri alma

Aynı oturum ve kapsam içinde en son atanan IDENTITY değerini döndürmek için SCOPE_IDENTITY işlevini kullanın; Böyle:

SELECT SCOPE_IDENTITY();

SCOPE_IDENTITY işlevi, herhangi bir tablo için geçerli kapsamda oluşturulan en son kimlik değerini döndürür. Belirli bir tabloda en son kimlik değerine ihtiyacınız varsa, IDENT_CURRENT işlevini aşağıdaki gibi kullanabilirsiniz:

SELECT IDENT_CURRENT('Sales.Promotion');

Kimlik değerlerini geçersiz kılma

Otomatik olarak oluşturulan değeri geçersiz kılmak ve IDENTITY sütununa belirli bir değer atamak istiyorsanız, önce SET IDENTITY INSERT table_name ON deyimini kullanarak kimlik eklemelerini etkinleştirmeniz gerekir. Bu seçenek etkinleştirildiğinde, diğer sütunlarda olduğu gibi kimlik sütunu için açık bir değer ekleyebilirsiniz. İşiniz bittiğinde, otomatik kimlik değerlerini kullanarak devam etmek için SET IDENTITY INSERT table_name OFF deyimini, açıkça tohum olarak girdiğiniz son değeri kullanarak kullanabilirsiniz.

SET IDENTITY_INSERT SalesLT.Promotion ON;

INSERT INTO SalesLT.Promotion (PromotionID, PromotionName, ProductModelID, Discount)
VALUES
(20, 'Another short sale',37, 0.3);

SET IDENTITY_INSERT SalesLT.Promotion OFF;

Öğrendiğiniz gibi IDENTITY özelliği, tablo içindeki bir sütun için bir dizi değer oluşturmak için kullanılır. Ancak IDENTITY özelliği, bir veritabanındaki birden çok tablo arasında değerleri koordine etmek için uygun değildir. Örneğin, kuruluşunuzun kurumsal bayilere yönelik doğrudan satış ile satış arasında ayrım yaptığı ve bu satışlara ilişkin verileri ayrı tablolarda depolamak istediğini varsayalım. Her iki satış türü için de benzersiz bir fatura numarası gerekebilir ve iki farklı satış türü için aynı değerin çoğaltılmasını önlemek isteyebilirsiniz. Bu gereksinime yönelik çözümlerden biri, her iki tabloda da benzersiz sıralı değerlerden oluşan bir havuz tutmaktır.

Kimlik sütununu yeniden görüntüleme

Bazen sütun için kimlik değerlerini sıfırlamanız veya atlamanız gerekir. Bunu yapmak için DBCC CHECKIDENT işlevini kullanarak sütunu "yeniden depolayacaksınız". Bunu kullanarak birçok değeri atlayabilir veya tablodaki tüm satırları sildikten sonra bir sonraki kimlik değerini 1'e sıfırlayabilirsiniz. DBCC CHECKIDENT'i kullanmanın tüm ayrıntıları için Transact-SQL başvuru belgelerine bakın.

SIRA

Transact-SQL'de, belirli bir tablodan bağımsız olarak yeni sıralı değerler tanımlamak için bir sıra nesnesi kullanabilirsiniz. İsteğe bağlı olarak veri türünü (0 ölçeğine sahip bir tamsayı türü veya ondalık veya sayısal olmalıdır), başlangıç değerini, artım değerini, maksimum değeri ve performansla ilgili diğer seçenekleri sağlayan CREATE SEQUENCE deyimi kullanılarak bir sıra nesnesi oluşturulur.

CREATE SEQUENCE Sales.InvoiceNumber AS INT
START WITH 1000 INCREMENT BY 1;

Bir diziden bir sonraki kullanılabilir değeri almak için, NEXT VALUE FOR yapısını kullanın, örneğin:

INSERT INTO Sales.ResellerInvoice
VALUES
(NEXT VALUE FOR Sales.InvoiceNumber, 2, GETDATE(), 'PO12345', 107.99);

KIMLIK veya SIRALI

Otomatik doldurma değerleri için IDENTITY sütunlarını mı yoksa SEQUENCE nesnesini mi kullanacağınıza karar verirken aşağıdaki noktaları göz önünde bulundurun:

  • Uygulamanız birden çok tablo veya tablo içindeki birden çok sütun arasında tek bir sayı serisi paylaşmayı gerektiriyorsa SIRALI kullanın.

  • SIRALI, değerleri başka bir sütuna göre sıralamanızı sağlar. NEXT VALUE FOR yapısı, sıralama sütununu belirtmek için OVER yan tümcesini kullanabilir. OVER yan tümcesi, döndürülen değerlerin OVER yan tümcesinin ORDER BY yan tümcesinin sırasına göre oluşturulmasını garanti eder. Bu işlev, bir SELECT içinde döndürülürken satırlar için satır numaraları oluşturmanıza da olanak tanır. Aşağıdaki örnekte, Production.Product tablosu Ad sütununa göre sıralanır ve döndürülen ilk sütun sıralı bir sayıdır.

    SELECT NEXT VALUE FOR dbo.Sequence OVER (ORDER BY Name) AS NextID,
        ProductID,
        Name
    FROM Production.Product;
    

    Önceki deyim yalnızca görüntülenecek SIRALI değerleri seçiyor olsa da, değerler hala 'kullanılmış' durumdadır ve görüntülenen SIRALI değerleri artık kullanılamaz. Yukarıdaki SELECT'i birden çok kez çalıştırırsanız, her seferinde farklı SIRALI değerleri alırsınız.

  • Uygulamanız aynı anda birden çok numara atanacaksa SIRALI kullanın. Örneğin, bir uygulamanın beş sıralı sayı ayırması gerekir. Kimlik değerlerini istemek, diğer işlemlerin aynı anda sayı verilmesi durumunda seride boşluklara neden olabilir. Dizideki birkaç sayıyı aynı anda almak için sp_sequence_get_range sistem yordamını kullanabilirsiniz.

  • SIRALI, artış değeri gibi sıranın belirtimini değiştirmenize olanak tanır.

  • KIMLIK değerleri güncelleştirmelerden korunur. Identity özelliğiyle bir sütunu güncelleştirmeye çalışırsanız bir hata alırsınız.