SQL Server'daki kayıtları sildikten sonra kimlik tohumunu sıfırlama


682

Kayıtları bir SQL Server veritabanı tablosuna ekledim. Tabloda birincil anahtar tanımlanmış ve otomatik artış kimlik tohumu “Evet” olarak ayarlanmış. Bu öncelikle SQL Azure'da, her tablonun tanımlı bir birincil anahtar ve kimliğe sahip olması gerektiği için yapılır.

Ancak bazı kayıtları tablodan silmek zorunda olduğum için, bu tabloların kimlik tohumu bozulur ve dizin sütunu (1'lik bir artışla otomatik olarak oluşturulur) bozulur.

Kayıtları sildikten sonra, sütunun artan sayısal sırada sıralaması olması için kimlik sütununu nasıl sıfırlayabilirim?

Kimlik sütunu, veritabanında hiçbir yerde yabancı anahtar olarak kullanılmaz.


4
"SQL Azure'da" - "her tablonun birincil anahtarı" - true - "ve Identity Defined" - false olmalıdır. Kimlik ve birincil anahtar dik kavramlardır. Kimlik sütunu, tablonun PK'si olmak zorunda değildir. Birincil anahtarın kimlik sütunu olması gerekmez.
Damien_The_Unbeliever

TAMAM. Konseptim yanlış olabilir. Ama şimdi masa yapısını PK ve Identity Seed ile tanımladım. Bazı satırları
silmem gerekirse

29
Her zaman bir kimlik sütununda üretilen gerçek sayısal değerleri önemsiyorsanız, bunları kötüye kullandığınızı iddia ederim. Bir kimlik sütunu ile dikkat etmeniz gereken tek şey, otomatik olarak benzersiz değerler (yay!) Oluşturması ve bu değerleri sayısal bir sütunda depolayabilmenizdir (bu bit, yalnızca bu değerleri tutmak için sütunları bildirmekle ilgilidir). Onları kimseye göstermemelisiniz, bu yüzden hangi değerleri aldıkları önemli değil.
Damien_The_Unbeliever

dbcc kontrolünü belirtilen diğer
komutları

Yanıtlar:


1100

DBCC CHECKIDENTYönetim komutu kimlik sayacını sıfırlamak için kullanılır. Komut sözdizimi:

DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]

Misal:

DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO

Azure SQL Veritabanı'nın önceki sürümlerinde desteklenmemiştir, ancak şimdi desteklenmektedir.


Bağımsız new_reseed_valuedeğişkenin belgelere göre SQL Server sürümleri arasında değiştiğini lütfen unutmayın :

Tabloda satırlar varsa, sonraki satır new_reseed_value değeriyle eklenir . SQL Server 2008 R2 ve önceki sürümlerinde, eklenen bir sonraki satır new_reseed_value + geçerli artış değerini kullanır .

Ancak, gözlemlenen davranış en azından SQL Server 2012 hala new_reseed_value + geçerli artış değeri mantığını kullandığını gösterir, çünkü bu bilgileri yanıltıcı (sadece düz yanlış aslında) bulabilirsiniz . Microsoft bile aynı sayfada bulunanla çelişiyor :Example C

C. Mevcut kimlik değerini yeni bir değere zorlamak

Aşağıdaki örnek, AddressType tablosundaki AddressTypeID sütunundaki geçerli kimlik değerini 10 değerine zorlar. Tablonun varolan satırları olduğundan, eklenen sonraki satır değer olarak 11'i, yani için tanımlanan yeni geçerli artış değerini kullanır sütun değeri artı 1.

USE AdventureWorks2012;  
GO  
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);  
GO

Yine de, tüm bunlar yeni SQL Server sürümlerinde farklı davranışlar için bir seçenek bırakır. Microsoft'un kendi belgelerindeki şeyleri temizleyene kadar, kullanmadan önce gerçek testler yapmak olduğundan emin olmanın tek yolu sanırım.


24
Sözdizimi ... DBCC CHECKIDENT ('[TestTable]', RESEED, 0) GO
Biki

2
DBCC CHECKIDENTGelecek sürüm olarak desteklendiği görülüyor (V12 / Sterling): azure.microsoft.com/en-us/documentation/articles/… Yine de, bu özel durum için hala TRUNCATE TABLE :) ' ı tavsiye ederim
Solomon Rutzky

1
"GO" başka bir çizgide olana kadar benim için işe yaramadı.
mrówa

1
Sözdizimi aynı satırdaki GO anahtar sözcüğü nedeniyle işaretleniyor, neden bilmiyorum. Bir çizgiden aşağıya taşıyabilir misin? Bu satırı 50 kez kopyalayıp yapıştırdım ve şimdi geri dönüp düzeltmem gerekiyor.
AnotherDeveloper

4
Benim için mükemmel çalıştı. Bir tablo yeniden ekilirken, ilk kaydınızın ID 1 olması için yeniden tohumlama yapmak istiyorsanız, reseed komutunun 0 olarak yeniden boyutlandırılması gerekir, böylece bir sonraki kayıt ID 1 olur.
Mike Upjohn

216
DBCC CHECKIDENT ('TestTable', RESEED, 0)
GO

0, identityBaşlangıç ​​değeridir


15
Tablo boş TRUNCATEbırakılmışsa , örneğin yeni aradığınız gibi , yeni tohum değeri bir sonraki kullanım değeri olmalıdır (yani 1 0 değil). Tablo boş değilse new_reseed_value + 1. MSDN
kjbartel

2
@kjbartel, Anil ve diğerleri: sadece "tablo boşsa" kadar basit değil. Dokümantasyon tablo nedeniyle boşken için durum eksikti DELETEdeğil TRUNCATE, bu durumda o da new_reseed+value + 1. Bu konuda bir test yazdım, bazı testlerle gerçek davranışı gösterdim ve gerçek dokümanı güncelledim (şimdi GitHub'da olmasından dolayı bunu yapabiliriz): DBCC CHECKIDENT Kimlik Tohumunu (RESEED) Sıfırlarken Nasıl Çalışır? .
Solomon Rutzky

87

IF unutulmamalıdır tüm veri ile tablosundan çıkarılır olan DELETE(yani, hiç WHEREmadde), daha sonra sürece) izinleri buna izin ve b) olduğu görülmektedir tablo (referans bir FKs vardır burada durum), TRUNCATE TABLEdaha verimli olduğu DELETE veIDENTITY aynı zamanda tohumu sıfırladığı için kullanılması tercih edilecektir . TRUNCATE TABLE için MSDN sayfasından aşağıdaki ayrıntılar alınmıştır :

DELETE deyimiyle karşılaştırıldığında, TRUNCATE TABLE aşağıdaki avantajlara sahiptir:

  • Daha az işlem günlüğü alanı kullanılır.

    DELETE deyimi satırları birer birer kaldırır ve silinen her satır için işlem günlüğüne bir girdi kaydeder. TRUNCATE TABLE, tablo verilerini depolamak için kullanılan veri sayfalarını ayırarak verileri kaldırır ve yalnızca işlem günlüğüne yalnızca sayfa ayırmalarını kaydeder.

  • Tipik olarak daha az kilit kullanılır.

    DELETE deyimi bir satır kilidi kullanılarak yürütüldüğünde, tablodaki her satır silinmek üzere kilitlenir. TRUNCATE TABLE her zaman tabloyu (şema (SCH-M) kilidi dahil) ve sayfayı kilitler, ancak her satırı kilitlemez.

  • İstisnasız, tabloda sıfır sayfa kalır.

    DELETE deyimi yürütüldükten sonra tablo yine de boş sayfalar içerebilir. Örneğin, bir yığındaki boş sayfalar en azından özel (LCK_M_X) bir tablo kilidi olmadan dağıtılamaz. Silme işlemi bir tablo kilidi kullanmazsa, tablo (yığın) birçok boş sayfa içerir. Dizinler için, silme işlemi boş sayfaları geride bırakabilir, ancak bu sayfalar bir arka plan temizleme işlemi tarafından hızlı bir şekilde yeniden yerleştirilir.

Tablo bir kimlik sütunu içeriyorsa, o sütunun sayacı sütun için tanımlanan tohum değerine sıfırlanır. Hiçbir tohum tanımlanmamışsa, varsayılan değer 1 kullanılır. Kimlik sayacını korumak için bunun yerine DELETE kullanın.

Yani aşağıdakiler:

DELETE FROM [MyTable];
DBCC CHECKIDENT ('[MyTable]', RESEED, 0);

Sadece olur:

TRUNCATE TABLE [MyTable];

TRUNCATE TABLEKısıtlamalar vb. Hakkında ek bilgi için lütfen belgelere (yukarıda bağlantılıdır) bakın.


8
Doğru koşullar altında daha verimli olmakla birlikte, bu her zaman bir seçenek değildir. Kesme, kendisine karşı FK tanımlanmış bir tabloda yürütülmez. Bağımlı kayıt olmasa bile, sınırlama varsa kesme başarısız olur. Ayrıca truncate, Delete'in yalnızca DELETE gerektirdiği ALTER izinlerini gerektirir.
Rozwel

3
@Rozwel Doğru, ancak cevabımı uygun izinlerin mevcut olması gerektiğini belirten niteliklere sahip olmuştum. Ayrıca, soru özellikle FK'ler olmadığını belirtir. Ancak, netlik amacıyla, "FK yok" kısıtlamasını belirtecek şekilde güncelledim. Bunu işaret ettiğiniz için teşekkürler.
Solomon Rutzky

1
tek kelime oyunu herhangi bir FK'nin kesmeyi engelleyeceğidir. PK veya kimlik sütunlarının bir parçası olmayan benzersiz bir kısıtlamaya karşı bir FK'ye sahip olmak (olağandışı olsa da) mümkündür.
Rozwel

1
@Rozwel Yine doğrudur, ancak PK'nın sadece OP'nin Azure SQL Veritabanı tarafından gerekli olduğu anlayışı (doğru ya da değil) nedeniyle var olduğu göz önüne alındığında benzersiz bir kısıtlama olmadığını varsaymak makul görünmektedir. Ne olursa olsun, ben belirsizliği azaltmak için hepim, bu yüzden tekrar güncelledim. Teşekkürler.
Solomon Rutzky

Bir masada yabancı bir anahtar bulunması olağandışı değildir ve HERHANGİ bir yabancı anahtarın bulunması TRUNCATE TABLE'ı yasaklar. Bu tablodaki diğer iki sütuna ve yabancı tablodaki benzersiz bir dizine karşı uygulanan bir yabancı anahtar içeren bir masada TRUNCATE TABLE'ı çalıştırmaya çalıştığımda bunu bugün zor bir şekilde keşfettim.
David A. Gray

83

Her ne kadar çoğu cevap 0'a RESEED önerirse de, birçok kez mevcut olan bir sonraki kimliğe tekrar ihtiyacımız var

declare @max int
select @max=max([Id])from [TestTable]
if @max IS NULL   //check when max is returned as null
  SET @max = 0
DBCC CHECKIDENT ('[TestTable]', RESEED,@max)

Bu tabloyu kontrol eder ve bir sonraki kimliğe sıfırlar.


2
Bu, zamanın% 100'ünde çalışan tek cevaptır
Tersine Mühendis

3
Biraz daha kısa:declare @max int select @max=ISNULL(max([Id]),0) from [TestTable]; DBCC CHECKIDENT ('[TestTable]', RESEED, @max );
Guillermo Prandi

61

@anil shahsCevap vermeyi denedim ve kimliğini sıfırladı. Ama yeni bir satır eklendiğinde identity = 2. Bunun yerine sözdizimini şöyle değiştirdim:

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

Sonra ilk satırın kimliği = 1 olur.



16

Çoğu yanıt önermekle RESEEDbirlikte 0, bazıları bunu TRUNCATEDtablolar için bir kusur olarak görse de , Microsoft'unID

DBCC CHECKIDENT ('[TestTable]', RESEED)

Bu tabloyu kontrol eder ve bir sonrakine sıfırlar ID. Bu, MS SQL 2005'ten beri mevcuttur.

https://msdn.microsoft.com/en-us/library/ms176057.aspx


1
Ne yazık ki bu doğru değil. Bunu MS SQL 2014 sunucusu için kontrol ettim.
alehro

1
Aslında, SQL 2014 için doğrudur. Ben sadece test ettim ve benim için çalıştı.
Daniel Dyson

2
Bu benim için SQL 2012'de tutarsız çalışıyor. Bazen beklediğim gibi bir sonraki kullanılabilir olanı kullanır, bazen tablodan eski bir değere yapışmış gibi görünüyor. Tohum her zaman çalışır.
Dan Field

SQL 2016'da benim için çalışmıyor - sadece kimlik tohumunu olduğu gibi bırakıyor. Benim için bir kez doğru çalışmış olabilir, ama aynı zamanda parmak sorunum da olabilir. Tekrar çalışmak için alınamıyor
Reversed Engineer

Mesaj başarıyı gösterir Checking identity information: current identity value '[incorrect seed]', current column value '[correct seed]'., ancak yeni kesici uçlar üzerinde hala yanlış tohum kullanılıyor.
Denziloe

7

2 komut vermek hile yapabilir

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

ilki kimliği sıfıra sıfırlar, sonra da bir sonraki kullanılabilir değere ayarlar - jacob


2
DBCC CHECKIDENT ('[TestTable]', RESEED) bir sonraki kullanılabilir değere yeniden yönlendirmiyor
Atal Kishore

Bu, tarafından kullanılan yöntemdir. "Kimlik sütunlarını yeniden boyutlandır" seçeneği açıldığında RedGate Data Compare . Ben kapsamlı test (RedGate aracında değil, SQL kodunda demek) ve güvenilir bir şekilde çalışır. (RedGate ile deneme sürümlerinin ara sıra kullanıcı olmasından başka bir ilişkim yok)
Reversed Engineer

6

@jacob

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

Benim için çalıştı, ben sadece tablodan önce tüm girişleri temizlemek zorunda kaldı, sonra silindikten sonra bir tetikleme noktasına yukarıdaki ekledi. Şimdi her sildiğimde oradan bir giriş alınır.


DBCC CHECKIDENT yalnızca silindikten sonra işlevseldir. Kesmeyi de kullanabilirsiniz. Ancak verilerin geri kalanına ihtiyacınız varsa kullanmayın. Ayrıca kesme, silinen kayıtların kayıt sayısını vermez.
user763539

6

Truncate kayıtları sildiği, sayacı sıfırladığı ve disk alanını geri kazandığı için tablo tercih edilir.

Deleteve CheckIdentyalnızca yabancı anahtarların kısalmanızı engellediği yerlerde kullanılmalıdır.


5

Yeni bir kimlikle kimlik sütununu sıfırla ...

DECLARE @MAX INT
SELECT @MAX=ISNULL(MAX(Id),0) FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED,@MAX)

4

Bu yaygın bir sorudur ve cevap her zaman aynıdır: yapma. Kimlik değerleri keyfi olarak ele alınmalıdır ve bu nedenle "doğru" bir düzen yoktur.


15
Bu, bir üretim ortamı için doğrudur, ancak gelişirken, bazı varlıkların bir tohum senaryosundan doldurulmuş belirli bir kimliği olduğunu hatırlamak isterim. Geliştirme sırasında veritabanında gezinmeyi çok daha kolay hale getirir.
Francois Botha

7
Bunun gibi cevaplar tamamen teoriktir ve nadiren gerçek dünyanın ihtiyaçlarına uyuyorlar. İnsanları dogmanızla beyin yıkama yerine OP sorusuna cevap veriyorsunuz ...
Serj Sagan

1
Güzel hikaye, kardeşim. Benim çektiğim şudur: Bir sütunun değerini belirtmek istiyorsanız, sütunda bunu zorlaştıran bir özellik seçmeyin. Kod kokusu şudur: Bir tabloya her kayıt eklediğinizde kimlik sütunu için bir değer belirtirseniz, kimlik sütununuz yoktur. Bütün kimlik noktası, sunucunun sizin için bir değer yaratmasını sağlamaktır. Dolayısıyla, bu zamanı geçersiz kılarsanız, sıfır olmayan bir maliyetle hiçbir şey kazanmazsınız. Ayrıca, ad hominem argümanı üzerinde iyi çalışmalar.
Ben Thul

5
Kesinlikle çekişmenize katılıyorum. Yüz değerine bakıldığında, OP kesinlikle yanlış yapıyor, ancak belki de OP'nin sorusunu cevaplamak için alakalı olduğunu düşünmediği daha derin bir ihtiyaç var. Bu nedenle soruyu cevaplayın ve cevabın bir parçası olarak "yapılacaklar ve yapılmayacaklar" tavsiyesi verin. Bu arada, karakterinize asla saldırmadım ... ad hominem demek sana aptal gibi bir şey dedim ...
Serj Sagan

1
Çoğu durumda kesinlikle doğru olsa da, bir tabloyu yeniden tohumlamanın meşru olduğu koşullar vardır. Örneğin, yerini alan önceki satırdaki mevcut satırları hesaba katmak için belirli bir noktadan başlaması gereken bir greenfield projesi üzerinde çalışıyorum. Geliştirme sırasında yeniden tohumlama meşru bir kullanım örneğidir, IMO.
David A. Gray

3

Kimlik sütununu sıfırlamak için bu komut dosyasını çalıştırın. İki değişiklik yapmanız gerekecek. TableXYZ'yi, güncellemeniz gereken tabloyla değiştirin. Ayrıca, kimlik sütununun adı geçici tablodan düştü. Bu, 35.000 satır ve 3 sütun içeren bir tabloda anlıkdı. Açıkçası, tabloyu yedekleyin ve önce bunu bir test ortamında deneyin.


select * 
into #temp
From tableXYZ

set identity_insert tableXYZ ON

truncate table tableXYZ

alter table #temp drop column (nameOfIdentityColumn)

set identity_insert tableXYZ OFF

insert into tableXYZ
select * from #temp

3
Bu tamamen doğru değil: SET IDENTITY_INSERT yanlış yerde. Bu KESILMESINDEN etrafında gitmez, bu INSERT INTO (dolayısıyla identity_ ekersen INSERT ). Ayrıca, bu sadece verilerin tutulması gerektiğinde kullanılmalıdır , aksi takdirde sadece tek TRUNCATE deyimini çalıştırmaya kıyasla çok verimsizdir.
Solomon Rutzky

1
DBCC CHECKIDENT (<TableName>, reseed, 0)

Bu, geçerli kimlik değerini 0 olarak ayarlar.

Bir sonraki değeri eklediğinizde, kimlik değeri 1'e çıkarılır.


1

Bu saklı yordamı kullanın:

IF (object_id('[dbo].[pResetIdentityField]') IS NULL)
  BEGIN
    EXEC('CREATE PROCEDURE [dbo].[pResetIdentityField] AS SELECT 1 FROM DUMMY');
  END
GO

SET  ANSI_NULLS ON
GO
SET  QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[pResetIdentityField]
  @pSchemaName NVARCHAR(1000)
, @pTableName NVARCHAR(1000) AS
DECLARE @max   INT;
DECLARE @fullTableName   NVARCHAR(2000) = @pSchemaName + '.' + @pTableName;

DECLARE @identityColumn   NVARCHAR(1000);

SELECT @identityColumn = c.[name]
FROM sys.tables t
     INNER JOIN sys.schemas s ON t.[schema_id] = s.[schema_id]
     INNER JOIN sys.columns c ON c.[object_id] = t.[object_id]
WHERE     c.is_identity = 1
      AND t.name = @pTableName
      AND s.[name] = @pSchemaName

IF @identityColumn IS NULL
  BEGIN
    RAISERROR(
      'One of the following is true: 1. the table you specified doesn''t have an identity field, 2. you specified an invalid schema, 3. you specified an invalid table'
    , 16
    , 1);
    RETURN;
  END;

DECLARE @sqlString   NVARCHAR(MAX) = N'SELECT @maxOut = max(' + @identityColumn + ') FROM ' + @fullTableName;

EXECUTE sp_executesql @stmt = @sqlString, @params = N'@maxOut int OUTPUT', @maxOut = @max OUTPUT

IF @max IS NULL
  SET @max = 0

print(@max)

DBCC CHECKIDENT (@fullTableName, RESEED, @max)
go

--exec pResetIdentityField 'dbo', 'Table'

Sadece cevabımı tekrar gözden geçiriyorum. Dikkat etmeniz gereken sql server 2008 r2'de garip bir davranışla karşılaştım.

drop table test01

create table test01 (Id int identity(1,1), descr nvarchar(10))

execute pResetIdentityField 'dbo', 'test01'

insert into test01 (descr) values('Item 1')

select * from test01

delete from test01

execute pResetIdentityField 'dbo', 'test01'

insert into test01 (descr) values('Item 1')

select * from test01

İlk seçim üretir 0, Item 1.

İkincisi üretiyor 1, Item 1. Sıfırlama, tablo oluşturulduktan hemen sonra yürütürseniz sonraki değer 0'dır. Dürüst olmak gerekirse, Microsoft bu şeyleri doğru alamıyor şaşırdım. Ben tabloları yeniden oluşturduktan sonra bazen tablolar zaten oluşturulduğunda bazen çalıştığım referans tabloları dolduran bir komut dosyası var çünkü keşfetti.


1

Bunu yapmak için aşağıdaki komut dosyasını kullanın. Tablodan tüm satırları sildiyseniz ve IDENT_CURRENTşu anda 1 olarak ayarlanmışsa , bir "hata" üreteceği tek bir senaryo vardır, yani tabloda başlamak için yalnızca bir satır vardır.

DECLARE @maxID int = (SELECT MAX(ID) FROM dbo.Tbl)
;

IF @maxID IS NULL
    IF (SELECT IDENT_CURRENT('dbo.Tbl')) > 1
        DBCC CHECKIDENT ('dbo.Tbl', RESEED, 0)
    ELSE
        DBCC CHECKIDENT ('dbo.Tbl', RESEED, 1)
    ;
ELSE
    DBCC CHECKIDENT ('dbo.Tbl', RESEED, @maxID)
;

0

Tam bir DELETE satır ve IDENTITY sayısını sıfırlamak için bunu kullanıyorum (SQL Server 2008 R2)

USE mydb

-- ##################################################################################################################
-- DANGEROUS!!!! USE WITH CARE
-- ##################################################################################################################

DECLARE
  db_cursor CURSOR FOR
    SELECT TABLE_NAME
      FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_TYPE = 'BASE TABLE'
       AND TABLE_CATALOG = 'mydb'

DECLARE @tblname VARCHAR(50)
SET @tblname = ''

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @tblname

WHILE @@FETCH_STATUS = 0
BEGIN
  IF CHARINDEX('mycommonwordforalltablesIwanttodothisto', @tblname) > 0
    BEGIN
      EXEC('DELETE FROM ' + @tblname)
      DBCC CHECKIDENT (@tblname, RESEED, 0)
    END

  FETCH NEXT FROM db_cursor INTO @tblname
END

CLOSE db_cursor
DEALLOCATE db_cursor
GO

0

Masayı bir bütün olarak temizlemediğiniz sürece 0'a yeniden tohumlama çok pratik değildir.

diğer akıllıca Anthony Raymond tarafından verilen cevap mükemmel. İlk önce maksimum kimlik sütununu alın, ardından max.


0

Bunu geliştirme sırasında çok sayıda tablo için yapmaya çalışıyordum ve bu bir cazibe olarak çalışıyor.

DBCC CHECKIDENT('www.newsType', RESEED, 1);
DBCC CHECKIDENT('www.newsType', RESEED);

Bu nedenle, önce onu 1 olarak ayarlamaya zorlarsınız, ardından tablodaki satırların en yüksek dizinine ayarlarsınız. Hızlı ve kolay idex dinlenme.


-2

Günlük alanı da kullanmadığından, tüm kayıtları silmek yerine TRUNCATE kullanmak her zaman daha iyidir .

Silmemiz ve tohumu sıfırlamamız gerektiğinde, tablonun hiç doldurulmadığı ve kullandıysanız DBCC CHECKIDENT('tablenem',RESEED,0) ilk kaydın msdn belgelerinde belirtildiği gibi kimlik = 0 alacağını unutmayın.

Sizin durumunuzda sadece dizini yeniden oluşturun ve ortak bir senaryo olduğu için kimlik serisini kaybetme konusunda endişelenmeyin.


3
Fikir gibi geliyor bana sadece bazı kayıtları silmek .
Drumbeg

6
Bu sadece basit bir yanlıştır - Kesik kullanımı her zaman daha iyi değildir ve aslında bazı, çok sınırlı ve spesifik senaryolarda daha iyidir. Cennet birinin tavsiyeni takip etmesini yasakladı ve sonra geri dönmesi gerekiyor.
Thronk

1
@Thronk Neden beklendiği gibi davranmasını TRUNCATEengelleyeceğinizi ima ediyorsunuz ROLLBACK? ROLLBACK hala geri dönüyor. DB olarak ayarlanmış olsa bile BULK_LOGGED.
Solomon Rutzky

2
TRUNCATE, DDL işlemidir ve günlük dosyasına kaydedilmez. İşlemin bir parçası olmadığı sürece (sorunun herhangi bir yerinde veya bu cevapta belirtilmemiş). Birisi her zaman her şeyin doğru olduğunu söylediğinde, yanlış oldukları için oldukça güvenli bir bahistir.
Thronk

Sekansın daha önce kullanılıp kullanılmamasına bağlı olarak RESEED davranışında bir fark olduğunu not eden tek cevap budur. Bazı tabloların önceden doldurulduğu birden çok boş tabloda aynı değerin yeniden oluşturulması , her tabloya eklenen ilk kayıt için farklı başlangıç ​​değerleriyle sonuçlanır .
simon coleman

-4

İlk olarak: Kimlik belirtimi Sadece: "Hayır" >> Veritabanı Kaydet projesi yürüt

Sonra: Kimlik özellikleri Sadece: "EVET" >> Veritabanını Kaydet Projeyi Yürüt

Veritabanı Kimliğiniz, PK 1'den başlayın >>

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.