IDENTITY değerini sıfırla


16

KİMLİK sütunu olan bir tablo var. Geliştirirken zaman zaman satırları silerim ve tekrar eklerim. Ancak KİMLİK değerleri her zaman artmaya devam etti ve onları tekrar eklediğimde 1'den başlamadı. Şimdi kimliğim 68 -> 92'den gidiyor ve bu kodumu kilitliyor.

IDENTITY değerini nasıl sıfırlarım?


Kodumu eksik kimlik değerlerine daha dayanıklı hale getireceğim. Bir kimlik sütunu bitişik numaralandırma garanti etmez ve edecek sonunda gerçekleşmesi
Trubs

Yanıtlar:


29

Kimlik değerini şu şekilde sıfırlayabilirsiniz:

DBCC CHECKIDENT('tableName', RESEED, 0)

Bu yüzden TableName'e bir dahaki sefer eklediğinizde, eklenen kimlik değeri 1 olacaktır.

Ne zaman silmek tablodan satırları, bu Kimlik değerini sıfırlamak olmaz, ama bunu artmaya devam edecektir. Tıpkı davanda olanlar gibi.

Ne zaman Şimdi kesecek tablo, bu tablonun orijinal Tohum değerine Kimlik değerini sıfırlar.

Ayrıntılı bir örnek ve Kesme ve Silme arasındaki farkın iyi bir açıklaması için SQL SERVER - DELETE, TRUNCATE ve RESEED Identity


22

Kin, IDENTITY değerini nasıl sıfırlayabileceğinizi gösterdi, ancak tüm verileri gerçekten kaldırdığınızda bir geliştirme ortamının dışında bunu neden yapmanız gerekiyor?

Umarım üretim yaparken bitişik bir KİMLİK değerleri dizisi sürdürmek istemezsiniz. Ve umarım IDENTITY değerlerini kodlamak için kodunuzu gerçekten yazmıyorsunuzdur. Bunlar anlamlı kimlik değerleri ise, IDENTITY özelliğini kullanmayı bırakmalısınız.

Bunun olmasını engelleyecek birkaç şey var:

  • bir işlem sırasında bir KİMLİK değeri atanırsa ve işlem geri alınırsa, değer "geri verilmez" ve sonraki değer hiç kullanılmamış olan + 1 olur.
  • bir satır daha sonra silinirse, IDENTITY boşlukları doldurmak için hiçbir zaman geri gelmez.
  • SQL Server 2012'de, SQL Server 2014 hiçbir zaman düzeltilmeyene kadar (belgelenmemiş ve çok pahalı bir izleme bayrağı kullanmazsanız) düzeltilmeyecek etkin bir hata var ve yeniden başlatmanın KİMLİK sütununuzdan 1000 değeri atar . Connect'teki hata, bunun Kullanılabilirlik Gruplarını içeren yük devretme olaylarıyla sınırlı olduğunu, ancak hatanın bundan daha geniş olduğunu garanti edebilirim.

Kısacası, boşlukları önemsiyorsanız veya bu değerlere özel bir anlam vermek istiyorsanız, KİMLİK kullanmayı bırakın. Tabloyu bırakın ve yeniden oluşturun ve değerleri silmeniz ve yeniden doldurmanız gerektiğinde, bir güncelleme gerçekleştirin veya bu sütun için sabit kodlanmış değerlere sahip bir ekleme yapın.

Bir kenara, birincil anahtar ve kimlik aynı şey değildir. Bir kimlik sütunu, açıkça bu şekilde tanımlamadığınız sürece birincil anahtar değildir ve kesinlikle bir kimlik sütunu olmayan bir birincil anahtarınız olabilir.


-4

Yalnızca bir kimlik alanının artan değerini izlemeyen son satırları kaldırmanız gerekirse, kolay ve güvenli bir yol vardır:

  1. ilk önce 'atlayan' son kayıtları silin
  2. Kimlik Alanınızın veri türünü değiştirme (int'den bigint'e veya tersi)
  3. masayı kaydet
  4. yeni bir kayıt ekleyin ve en yüksek değerin + 1 sayısını atadığını kontrol edin
  5. Kimlik Alanınızın veri türünü ihtiyaçlarınıza uygun olarak değiştirin

ve işiniz bitti.


3
"Tabloyu Kaydet" SQL Server için anlamlı bir ifade değil. Veri türlerini değiştirmek 100'den az satırla önemsiz olabilir, ancak büyük tablolar için çok pahalı olabilir .
Michael Green

2
SSMS'de demek istediğini sanıyorum. Bu, yeni bir tablo oluşturur, tüm satırları tabloya kopyalar, eski tabloyu bırakır ve yeni tabloyu yeniden adlandırır. Ve veri tipini geri değiştirmek için bunu iki kez yapmanız gerekir. Bir somun kırmak için balyoz kullanıyor.
Martin Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.