Tablodaki Mevcut Kolona Identity Özelliği Set Etmek
Bu makaleyi okumadan önce tabloda identitiy özelliğinin ne olduğunu anlamak için “Identitiy column ve manual olarak bu kolona insert yapmak(Identitiy insert)” isimli makalemi okumanızı tavsiye ederim.
Bazen tablolarımızda başlangıçta identitiy özelliği set edilmemiş ve sonradan bu özelliğin set edilme ihtiyacı ortaya çıkmış olabilir. Bu makalede tablodaki mevcut bir kolona identitiy özelliği nasıl set edilir bundan bahsedeceğiz.
Bu işlemi iki yöntemle yapabilirsiniz.
- Identitity özelliği olan yeni bir tablo oluşturup mevcut kayıtları bu yeni tabloya aktarmak
- Tabloya identity özelliği olan yeni bir kolon ekleyip eski kolonu silmek
Öncelikle aşağıdaki script yardımıyla ID ve AdSoyad kolonlarından oluşan ve identity özelliği set edilmemiş bir tablo oluşturalım ve bu tabloya birkaç kayıt girelim.
CREATE TABLE [dbo].[IdentitiyOrnekTablo]( [ID] [int] NULL, [AdSoyad] [varchar](250) NULL ) ON [PRIMARY] GO INSERT INTO [dbo].[IdentitiyOrnekTablo]([ID],[AdSoyad])VALUES (1,'Nurullah ÇAKIR') INSERT INTO [dbo].[IdentitiyOrnekTablo]([ID],[AdSoyad])VALUES (3,'Faruk ERDEM') INSERT INTO [dbo].[IdentitiyOrnekTablo]([ID],[AdSoyad])VALUES (2,'Hakan GÜRBAŞLAR')
Yukarda bahsettiğimiz iki madde ile örnek tablomuz üzerinde bu işlemi gerçekleştirelim.
1) Identitity özelliği olan yeni bir tablo oluşturup mevcut kayıtları bu yeni tabloya aktarmak:
Tablo üzerine sağ tıklayıp aşağıdaki gibi design diyoruz.
Açılan ekranda Identity özelliği set etmek istediğimiz kolona tıklayarak aşağıdaki kısımdan Identity Specification’ın ağaç yapısını açıyoruz ve Is Identity kısmında No gördüğünüz yere çift tıklıyoruz ve aşağıdaki ekranda gördüğünüz gibi değerler değişiyor.
Daha sonra aşağıdaki ekranda işaretlenmiş kutucağa tıklayarak yapılan işlemlerin script’ini alıyoruz.
Karşımıza aşağıdaki gibi bir script çıkıyor.
BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_IdentitiyOrnekTablo ( ID int NOT NULL IDENTITY (1, 1), AdSoyad varchar(250) NULL ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_IdentitiyOrnekTablo SET (LOCK_ESCALATION = TABLE) GO SET IDENTITY_INSERT dbo.Tmp_IdentitiyOrnekTablo ON GO IF EXISTS(SELECT * FROM dbo.IdentitiyOrnekTablo) EXEC('INSERT INTO dbo.Tmp_IdentitiyOrnekTablo (ID, AdSoyad) SELECT ID, AdSoyad FROM dbo.IdentitiyOrnekTablo WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_IdentitiyOrnekTablo OFF GO DROP TABLE dbo.IdentitiyOrnekTablo GO EXECUTE sp_rename N'dbo.Tmp_IdentitiyOrnekTablo', N'IdentitiyOrnekTablo', 'OBJECT' GO COMMIT
Bu scrit’te gördüğünüz gibi yeni bir tablo oluşturuyor, mevcut tablodaki kayıtları yeni tabloya aktarıyor ve eski tabloyu silerek yeni oluşturduğu tablonun ismini değiştiriyor.
Eğer tablonuz büyükse bu işlem uzun sürecektir ve bu işlem sürdüğü sürece sisteminiz çalışmayacaktır ama mevcut ID değerlerinizin korunmasın gerekiyorsa işinize yarayacak tek yöntem budur.
2)Tabloya identity özelliği olan yeni bir kolon ekleyip eski kolonu silmek:
Aşağıdaki script yardımıyla identity yapmak istediğiniz mevcut kolonu silip, tabloya identity özelliği olan yeni bir kolon ekleyebilirsiniz. Ama bu şekilde mevcut ID kolonunuzun değerleri silinip sıfırdan yeniden verilecektir. Eğer ID kolonundaki mevcut değerlerin silinmemesini istiyorsanız 1.yöntemi kullanmanızı tavsiye ederim. Ekstra bir bilgi olarak 2. yöntem, 1.yöntem’e göre çok daha hızlı bir şekilde tamamlanacaktır.
ALTER TABLE dbo.IdentitiyOrnekTablo DROP COLUMN ID ALTER TABLE [dbo].[IdentitiyOrnekTablo] ADD ID INT IDENTITY (1, 1) NOT NULL;