我已經從SQL Server數據庫中的表中刪除了一些記錄。現在ID從101到1200.我想再次刪除記錄,但我希望ID回到102.有沒有辦法在SQL Server中執行此操作?刪除後重置SQL Server中的自動增量
回答
我想通了。它是:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
你不想這樣做一般。 Reseed可能會造成數據完整性問題。它僅適用於您將所有測試數據清除並重新開始的開發系統。如果所有相關記錄都沒有被刪除(不是每個表應該處於外鍵關係!),它都不應該用於生產系統。你可以創建一個混亂的做法,特別是如果你的意思是在每次刪除之後定期做到這一點。擔心身份領域價值觀上的差距是一個糟糕的主意。
半傻瓜型:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
如果數= 0,則在下一插入自動遞增字段將包含值1
如果數= 101然後在下一次插入時,自動增加字段將包含值102
一些額外的信息...可能是有用的,你
在上面的查詢給予自動遞增number
之前,你必須確保你的現有表的自動遞增列包含的值小於number
。
要想從一個表(表1)列(列)的最大值,可以使用下面的查詢
SELECT MAX(column_name) FROM table1
試試這個:
ALTER TABLE tablename AUTO_INCREMENT = 1
刪除和補種的所有表在數據庫中。
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.
基於公認的答案,對於那些誰遇到過類似的問題,以飽滿的架構資質:
([MyDataBase].[MySchemaName].[MyTable]
)...導致一個錯誤,你需要在DB
即的背景下,下面將拋出一個錯誤:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
用單引號代替附上的完全限定的表名:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
幾個答案建議使用的語句是這樣的:
DBCC CHECKIDENT (mytable, RESEED, 0)
但是OP說「刪除了一些記錄」,可能不是全部,所以0的值並不總是正確的。另一個答案建議自動找到最大當前值並重新播種,但如果表中沒有記錄會遇到麻煩,因此max()將返回NULL。使用簡單
DBCC CHECKIDENT (mytable)
重置價值的註釋建議,但另一個評論正確地指出,這只是增加值最大的已經在表中;如果它已經高於表中的最大值,這不會降低它的值,這是OP想要做的。
更好的解決方案結合了這些想法。第一CHECKIDENT重置價值爲0,它的第二復位到表中目前的最高值,如果有表中的記錄:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
由於多個評論表明,要確保有不其他表中的外鍵指向已刪除的記錄。否則,這些外鍵將指向您重新創建表後創建的記錄,這幾乎肯定不是您想要的。
我想添加此答案,因爲DBCC CHECKIDENT
-approach會在您爲表使用模式時產生問題。使用這是肯定的:如果你想檢查操作的成功
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
,使用
SELECT IDENT_CURRENT(@Table);
應在上面的例子中輸出0
。
- 1. 如何重置所有數據後在SQL Server中的自動增量刪除
- 2. 自動增量從表中刪除後
- 3. 從PHP刪除後重置mysql自動增量字段值?
- 4. 如何重置SQL Server中的自動增量?
- 5. SQL Server自動增量
- 6. 在Microsoft SQL Server 2008 R2中重置自動增量
- 7. 刪除表格中的所有行,並重置自動增量
- 8. 如何在laravel用戶刪除中重置自動增量?
- 9. Microsoft SQL重置ID自動增量
- 10. 重置自動增量序列pl-sql
- 11. SQL Anywhere自動增量重置
- 12. 重置數據刪除MySQL後的自動增加值
- 13. 刪除所有字段的自動增量和重置計數
- 14. 刪除自動增量中的差距
- 15. mysql自動增量 - 記錄刪除後重新分配
- 16. SQL Server的INSERT語句自動增量
- 17. 的SQL Server 2008:後重新刪除
- 18. 刪除自動遞增按腳本的SQL Server
- 19. 重置h2中的自動增量
- 20. 重置mysql中的自動增量值
- 21. 重置DataTable中的自動增量
- 22. 在SQL Server 2008中自動刪除行
- 23. 刪除倒置的重複項 - SQL Server
- 24. SSMS SQL Server 2008 R2自動增量
- 25. SQL Server自動增量索引由1000
- 26. SQL Server:自動增量字符pk
- 27. 自動遞增的SQL Server
- 28. SQL Server:主鍵自動增量 - 刪除的行和空閒鍵值是什麼?
- 29. 在Android SQLite中重置自動增量
- 30. 重置視覺工作室中的白天自動增量 - SQL
請不要說「不要這樣做」。當我問及如何做某事時,我討厭它,而我所得到的只是不這樣做。是的,重置身份可能會導致外鍵問題,但前提是您不知道數據庫和相應的程序。在調整刪除後重置身份有很好的理由 - 他們被稱爲審計員。審計人員不願意看到差距,所以填寫它們,以可控制的方式執行,並確保外鍵約束得以維持。 – 2012-06-27 07:43:41
@spyder,你知道如果記錄插入不僅僅是爲了刪除而回滾,你將會有空白嗎?你不能避免與自動增量的差距,嘗試是愚蠢的。我曾經爲一家審計機構工作過,有能力的審計師可以向他們解釋這一點。此外,如果你有適當的審計表,他們可以看到這些記錄發生了什麼。或者如果由於法律原因(有少數情況下)沒有差距,那麼只有一個不稱職的開發人員會使用自動增量,而審計人員會很失望。 – HLGEM 2012-08-30 21:19:50