SQL Server administration and T-SQL development, Web Programming with ASP.NET, HTML5 and Javascript, Windows Phone 8 app development, SAP Smartforms and ABAP Programming, Windows 7, Visual Studio and MS Office software
Development resources, articles, tutorials, code samples, tools and downloads for ASP.Net, SQL Server, Reporting Services, T-SQL, Windows, AWS, SAP HANA and ABAP

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.



SQL Server

SQL Server 2019 Installation
download SQL Server 2019
download SQL Server 2017
download SQL Server 2016
download SQL Server 2014
download SQL Server 2012
MacOS ve SQL Server 2019


Copyright © 2004 - 2021 Eralper YILMAZ. All rights reserved.