2009-02-04 85 views
199

我已經從SQL Server數據庫中的表中刪除了一些記錄。現在ID從101到1200.我想再次刪除記錄,但我希望ID回到102.有沒有辦法在SQL Server中執行此操作?刪除後重置SQL Server中的自動增量

+33

請不要說「不要這樣做」。當我問及如何做某事時,我討厭它,而我所得到的只是不這樣做。是的,重置身份可能會導致外鍵問題,但前提是您不知道數據庫和相應的程序。在調整刪除後重置身份有很好的理由 - 他們被稱爲審計員。審計人員不願意看到差距,所以填寫它們,以可控制的方式執行,並確保外鍵約束得以維持。 – 2012-06-27 07:43:41

+6

@spyder,你知道如果記錄插入不僅僅是爲了刪除而回滾,你將會有空白嗎?你不能避免與自動增量的差距,嘗試是愚蠢的。我曾經爲一家審計機構工作過,有能力的審計師可以向他們解釋這一點。此外,如果你有適當的審計表,他們可以看到這些記錄發生了什麼。或者如果由於法律原因(有少數情況下)沒有差距,那麼只有一個不稱職的開發人員會使用自動增量,而審計人員會很失望。 – HLGEM 2012-08-30 21:19:50

回答

348

發出以下命令補種MYTABLE從1開始:

DBCC CHECKIDENT (mytable, RESEED, 0) 

讀到它在在線(BOL,SQL幫助)的書。另外請注意,您沒有比您設定的種子更高的記錄。

+3

...因爲這些記錄的ID將會被愉快地重新使用,造成糟糕的混亂。 – nalply 2010-09-17 10:16:10

+0

零點怎麼樣? – Joset 2012-11-06 02:58:56

+3

實際上,爲了從1開始編號,則需要使用0:`DBCC CHECKIDENT(MYTABLE,RESEED,0)` – 2012-12-24 00:33:42

3

我想通了。它是:

DBCC CHECKIDENT ('tablename', RESEED, newseed) 
2

你不想這樣做一般。 Reseed可能會造成數據完整性問題。它僅適用於您將所有測試數據清除並重新開始的開發系統。如果所有相關記錄都沒有被刪除(不是每個表應該處於外鍵關係!),它都不應該用於生產系統。你可以創建一個混亂的做法,特別是如果你的意思是在每次刪除之後定期做到這一點。擔心身份領域價值觀上的差距是一個糟糕的主意。

63
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number) 

如果數= 0,則在下一插入自動遞增字段將包含值1

如果數= 101然後在下一次插入時,自動增加字段將包含值102


一些額外的信息...可能是有用的,你

在上面的查詢給予自動遞增number之前,你必須確保你的現有表的自動遞增列包含的值小於number

要想從一個表(表1)列(列)的最大值,可以使用下面的查詢

SELECT MAX(column_name) FROM table1 
7

試試這個:

ALTER TABLE tablename AUTO_INCREMENT = 1 
5

刪除和補種的所有表在數據庫中。

USE [DatabaseName] 
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"  -- Disable All the constraints 
    EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data 
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0 
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back 

-- You may ignore the errors that shows the table without Auto increment field. 
4

基於公認的答案,對於那些誰遇到過類似的問題,以飽滿的架構資質:

[MyDataBase].[MySchemaName].[MyTable])...導致一個錯誤,你需要在DB

即的背景下,下面將拋出一個錯誤:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0) 

用單引號代替附上的完全限定的表名:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0) 
2

幾個答案建議使用的語句是這樣的:

DBCC CHECKIDENT (mytable, RESEED, 0) 

但是OP說「刪除了一些記錄」,可能不是全部,所以0的值並不總是正確的。另一個答案建議自動找到最大當前值並重新播種,但如果表中沒有記錄會遇到麻煩,因此max()將返回NULL。使用簡單

DBCC CHECKIDENT (mytable) 

重置價值的註釋建議,但另一個評論正確地指出,這只是增加值最大的已經在表中;如果它已經高於表中的最大值,這不會降低它的值,這是OP想要做的。

更好的解決方案結合了這些想法。第一CHECKIDENT重置價值爲0,它的第二復位到表中目前的最高值,如果有表中的記錄:

DBCC CHECKIDENT (mytable, RESEED, 0) 
DBCC CHECKIDENT (mytable) 

由於多個評論表明,要確保有不其他表中的外鍵指向已刪除的記錄。否則,這些外鍵將指向您重新創建表後創建的記錄,這幾乎肯定不是您想要的。

0

我想添加此答案,因爲DBCC CHECKIDENT -approach會在您爲表使用模式時產生問題。使用這是肯定的:如果你想檢查操作的成功

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable'; 
DBCC CHECKIDENT (@Table, RESEED, 0); 

,使用

SELECT IDENT_CURRENT(@Table); 

應在上面的例子中輸出0