DBCC CHECKIDENT (TableName, RESEED, IdentityValue) ile bir tablodaki Identity değerini değiştirmek
Bir SQL Server 2000 veritabanında DBCC CHECKIDENT (TableName, RESEED, IdentityValue) komutu ile tablo ismini parametre olarak geçerek o tablodaki Identity değerini değiştirebilirsiniz.
Örneğin aşağıdaki script ile oluşturduğunuz bir tablonuz olsun.
CREATE TABLE TestIdentity (
id int IDENTITY (1, 1) NOT NULL ,
value int NULL
)
INSERT INTO TestIdentity SELECT 1
INSERT INTO TestIdentity SELECT 2
INSERT INTO TestIdentity SELECT 3
Ve id kolonundaki değerler sıralı olarak artıyor olsun.
Bir şekilde bir nedenden dolayı aşağıdakine benzer bir scripti kullanarak
identity kolonuna explicit olarak bir değer girmek zorunda kaldığınızı
varsayalım.
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity (id, value) SELECT 100, 100
SET IDENTITY_INSERT TestIdentity OFF
TestIdentity tablosu üzerinde bir SELECT ifadesi çalıştırarak identity
kolonundaki atlamayı görebilirsiniz.
SELECT * FROM TestIdentity
Şimdi 4 değerini value kolonuna girelim.
INSERT INTO TestIdentity SELECT 4
Tekrar "SELECT * FROM TestIdentity" ifadesini çalıştırdığınızda
identity kolonu olan "id" kolonundaki değerin 101 olduğunu arada gerçekleşmiş
sıçramadan etkilenerek artmaya devam ettiğini görebilirsiniz.
Yeni gireceğimiz kayıtlarda id kolonuna atanacak değerlerin sıçramanın etkisini
görmeden daha önce kaldığı yerden artarak devam etmesi için aşağıdaki
DBCC CHECKIDENT sql fonksiyonunu kullanabiliriz.
DBCC CHECKIDENT (TestIdentity, RESEED, 3)
DBCC CHECKIDENT komutunun çalıştırılması sonucunda bilgi amaçlı aşağıdaki
ileti benzeri bir mesaj alacaksınız.
Checking identity information: current identity value '101', current column
value '3'.
DBCC execution completed. If DBCC printed error messages, contact your system
administrator.
Bu mesajdan şuanki identity değerinin 101'den 3'e çekildiğini anlayabiliriz.
Şimdi 5 değerini tabloya kaydetmeyi deneyelim.
INSERT INTO TestIdentity SELECT 5
Ve insert işleminin ardından tablo üzerinde SELECT ifadesini yeniden çalıştırdığımızda
identity kolonumuz olan id kolonundaki değerin istediğimiz gibi daha önceden
girilmiş değerlerin devamı olarak atandığını göreceğiz.
Pekala, id değerimiz sıçrama yaptığı 100 değerine zaman içinde tekrar
ulaşırsa ne olacak?
Birinci olasılık eğer TestIdentity tablosunu oluşturmak için yukarıda
yazılı script'i kullanmışsak id kolonunda aynı değerde birden fazla kayıt
bulunabileceği için herhangi bir problem olmayacaktır.
Identity kolonunun değerini 99'a çekelim;
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity (id, value) SELECT 99, 99
SET IDENTITY_INSERT TestIdentity OFF
Ardından 100 değerini TestIdentity tablosuna kaydedelim.
INSERT INTO TestIdentity SELECT 100
Tablomuzda artık id değeri 100 olan iki kaydımız oluştu.
Peki tablomuzun yapısı biraz daha farklı olsaydı nasıl bir sonuçla karşılaşabilirdik?
Eğer identity kolonumuz olan id kolonunu Primary Key olarak atasaydık veya id kolonu üzerinde Unique Constraint oluşturmuş olsaydık nasıl bir sonuç alacaktık?
TRUNCATE TABLE TestIdentity
komutu ile tablomuzdaki kayıtları silelim ve identity değerini de reset'leyelim.
Aşağıdaki Alter Table komutu ile TestIdentity tablomuzdaki id kolonunu tablonun Primary Key kolonu olarak atayalım.
ALTER TABLE TestIdentity
ADD CONSTRAINT PK_TestIdentity PRIMARY KEY (id)
Tekrar senaryomuzun başına dönersek test kayıtlarını aşağıdaki scripleri çalıştırarak oluşturabiliriz. Aralarda SELECT * FROM TestIdentity sql ifadesini çalıştırırsanız işlemler daha anlamlı olacaktır.
INSERT INTO TestIdentity SELECT 1
INSERT INTO TestIdentity SELECT 2
INSERT INTO TestIdentity SELECT 3
GO
İlk 3 kaydımızdan sonra identity değerini 100'e yükseltiyoruz.
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity (id, value) SELECT 100, 100
SET IDENTITY_INSERT TestIdentity OFF
GO
Daha sonra identity kolonunun 101 değeri aldığını aşağıdaki insert
ifadesi ile göreceğiz.
INSERT INTO TestIdentity SELECT 4
GO
DBCC CHECKIDENT ifadesi ile identity değerini istediğimiz bir değere çekebiliyoruz.
DBCC CHECKIDENT (TestIdentity, RESEED, 3)
GO
Ve aşağıdaki insert ifadesi ile id kolonunun değerinin DBCC CHECKIDENT komutundan verdiğimiz değere göre atanmaya başladığını görebiliriz.
INSERT INTO TestIdentity SELECT 5
GO
İkinci durum senaryosunu oluşturmak için identity kolonunun değerini tekrar
kritik noktaya taşıyalım.
SET IDENTITY_INSERT TestIdentity ON
INSERT INTO TestIdentity (id, value) SELECT 99, 99
SET IDENTITY_INSERT TestIdentity OFF
GO
Şimdi aynı zamanda Primary Key olan identity kolonunda dublicate kaydı oluşturacak
aşağıdaki ifadeyi çalıştıralım.
INSERT INTO TestIdentity SELECT 100
Alacağımız hata mesajı aşağıdaki olacaktır.
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_TestIdentity'. Cannot insert duplicate
key in object 'TestIdentity'.
The statement has been terminated.
Bu hata iletisinde Primary Key constraint'inin ihlal edildiğini, tabloya
tekrarlayan (dublicate) key girilemeyeceğini belirtiyor.
DBCC CHECKIDENT ile identity kolon değerlerini nasıl küçültebileceğimizi gördük.
Aynı zamanda üzerinde Primary Key veya Unique Constraint tanımlı kolonlarda karşılaşabilceğimiz en temel hatayı da oluşturarak görmüş olduk.