删除后重置SQL Server中的自动增量

我从SQL Server数据库的表中删除了一些logging。 现在ID从101到1200.我想再次删除logging,但我想要的ID回到102.是否有办法在SQL Server中这样做?

发出以下命令以使mytable变为从1开始:

DBCC CHECKIDENT (mytable, RESEED, 0) 

请阅读“在线图书”(BOL,SQL帮助)。 另外要小心,你没有比你设定的种子更高的logging。

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

如果number = 0,则在下一次插入时,自动增加字段将包含值1

如果number = 101,那么在下一个插入时,自动增加字段将包含值102

一些额外的信息…可能对你有用

在给出上述查询中的自动增量number之前,必须确保现有表的自动增量列包含的值小于该number

要从表(table1)中获取列(column_name)的最大值,可以使用以下查询

  SELECT MAX(column_name) FROM table1 

半防白痴:

 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

尝试这个:

 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) 

一般来说,你不想这样做。 Reseed可以创build数据完整性问题。 它只是用于开发系统,在这个系统中,你正在清除所有的testing数据并重新开始。 如果所有相关logging都没有被删除(不是每个应该处于外键关系的表都是!),它不应该被用在生产系统上。 你可以创build一个混乱做这个,特别是如果你的意思是在每次删除后定期做。 担心身份领域价值观的差距是一个糟糕的主意。

我想到了。 它的:

  DBCC CHECKIDENT ('tablename', RESEED, newseed) 

几个答案build议使用这样的陈述:

 DBCC CHECKIDENT (mytable, RESEED, 0) 

但是OP表示“删除了一些logging”,可能不是全部,所以0的值并不总是正确的。 另一个答案build议自动find最大的当前值并重新编译到那个,但是如果表中没有logging就会遇到麻烦,因此max()将返回NULL。 build议使用简单的评论

 DBCC CHECKIDENT (mytable) 

重置值,但另一个评论正确地表示,这只会增加到已经在表中的最大值; 如果它已经高于表中的最大值,那么这个值就不会降低,这是OP想要做的。

更好的解决scheme结合了这些观点 第一个CHECKIDENT将值重置为0,第二个重置为当前表中最高值,以防表中有logging:

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

正如多个注释所示,确保其他表中没有指向已删除logging的外键。 否则,这些外键将指向您重新创build表后创build的logging,这几乎不是您想要的。

我想添加此答案,因为DBCC CHECKIDENT -approach将产生问题,当您使用模式的表。 用这个来确定:

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

如果要检查操作是否成功,请使用

 SELECT IDENT_CURRENT(@Table); 

在上面的例子中应该输出0