MSSQL’de otomatik artan alanlara insert sırasında veri kaydı gerçekleştirmek için IDENTITY_INSERT kodunu kullanmalısınız.
SQLSERVER IDENTITY_INSERT ile otomatik artan alanlara veri kaydı
Şimdi Kullanıcılar adında bir tablo oluşturalım ve id, ad alanlarını tabloya ekleyelim.
1 2 3 4 | CREATE TABLE Users( Id int NOT NULL PRIMARY KEY IDENTITY, NAME NVARCHAR(50) ) |
Şimdi ise identity_insert ile id alanı identity bir alan olmasına rağmen aşağıdaki gibi bir kullanım ile rahatça insert işlemi yapabilirsiniz.
1 2 3 4 5 | SET IDENTITY_INSERT Users ON INSERT INTO Users(Id,NAME) VALUES(1,'Murat ÖNER') INSERT INTO Users(Id,NAME) VALUES(2,'Hakan GÜNER') INSERT INTO Users(Id,NAME) VALUES(3,'Muhammed Emin Öztürkler') SET IDENTITY_INSERT Users OFF |
IDENTUTY_INSERT’ün kullanım zamanına örnek verecek olursak düşününkü yedeğini aldığını 1000’lerce kaydı id adında bir identity alanın değerleriyle beraber insert cümlesi şeklinde aldınız eğer identity_insert kullanmasaydık ya id alanının identity özelliğini geçici olarak kapatacaktık yada insert cümlesinden id alanını ve değerlerini silecektik bunlara gerek olmadan üstte yer alan koddaki gibi basit bir kullanım ile identity alanlar için insert işlemini kolayca yapabilirsiniz.
Murat bey, veri tabanımdaki tabloların hepsinin ID’sine identity_insert(yes) özelliğini ekliyorum. Programı kapatıp açtığımda, bütün ID’lerimin identity_insert özelliği NO oluyor. Bu sorunu nasıl çözebilirim.
EntityFramework gibi ORM kütüphanesi mi kullanıyorsunuz?
Murat bey, örnekte yeni oluşturulan bir tabloya uyguladığınızda problem yok.
Peki ya içerisinde kayıtlar mevcut olan önceden oluşturulmuş bir tabloya uygulamaya kalkarsak.
Şöyle ki 1 Nolu ID mevcut, ama biz yine de kayıt eklerken ID: 1 yazdık, o zaman sakıncalı olmaz mı?
Burada şöyle bir durum var dediğiniz doğru fakat identity_insert özelliğini geçici olarak kapatıp manuel olarak id değerini girmek istediğiniz alan eğer primary key yada unique key ise o zaman aynı değeri insert etmeye kalksanız hata verecektir herhangi bir key özelliği yoksa o zaman bir risktir, bu durumdada dikkat etmek gerekli.