Identity Değerini Güncellemek – CHECKIDENT

Üzerinde IDENTITY alanı bulunan bir tabloda o alandaki sayılar verilmiş ritmik değere göre ardışık gider. Her yeni kayıtta bu sayı artar. Bu kayıtlardan biri silindiği zaman o satıra ait IDENTITY değeri bir daha kullanılmaz. Dolayısıyla bir süre sonra silmelerden dolayı bu sayı dizisinde çok fazla atlamalar söz konusu olur. Bazı durumlarda bu alanı baştan numaralandırma durumumuz olabilir mi. Bu tablonun başka bir tabloyla ilişkili olması da göz önünde bulundurularak bir güncelleme işlemi yapılabilir.

Veya bir tablodaki kayıtları başka bir tabloya aktardığımızda yeni tablodaki IDENTITY alanını yeniden düzenlemek isteyebiliriz. DBCC CHECKIDENT komutu bu işlemi yapmamızı sağlar.

DBCC CHECKIDENT (‘Tablo Adı’,RESEED, Başlangıç Sayısı)

Aşağıdaki örnekte üzerinde IDENTITY alanı bulunan geçici bir tablo oluşturulmuş ve içerisine sysobjects tablosundaki kayıtlar aktarılmış ardından tablodaki satırların çoğunluğu silinmiş. ID alanı 10 üzerinde olan tüm kayıtlar silindiği için yeni bir kayıt eklendiğinde bu numara

-- IDENTITY bulunan bir tablo oluşturalım
SELECT 
     ID = IDENTITY(INT,1,1)
    ,name
INTO ##T
FROM dbo.sysobjects 
-- 87 kayıt eklendi

-- 10 üzerindeki tüm satırları silelim
DELETE FROM ##T WHERE ID > 10
--77 kayıt silindi

--Tablodaki identity kolonundaki en yüksek değeri okuyalım
SELECT IDENT_CURRENT('##T')
--Bu örnek için 87 döndü. Yani yeni bir kayıt ekleyecek olursa ona 88 değeri verilecek. 
--Oysa tabloda şu anda 10 kayıt var ve 11 ile başlaması daha mantıklı olacaktır.

-- Tabloyu table scan yapıp max identity değerini alalım. Tablodaki en yüsek ID'yi bir değişkene atayalım
DECLARE @maxIdentityValue INT = (SELECT MAX(ID) FROM ##T)
--Bu sorgu 10 değerini döndürecek

-- IDENTITY kolonunun başlangıcını 10 olarak set edeli
DBCC CHECKIDENT('##T', RESEED, @maxIdentityValue)

-- Test amaçlı yeni kayıt ekleyelim. Bu kaydın değeri 11 olarak oluşturulacak
INSERT INTO ##T VALUES('Yeni Kayıt')

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.