我从SQL Server数据库的一个表中删除了一些记录。
表中的id是这样的:
99 100 101 1200 1201...
我想删除后来的记录(ID >1200),然后我想重置自动增量,以便下一个自动生成的ID将是102。所以我的记录是顺序的,有办法做到这一点在SQL Server?
我从SQL Server数据库的一个表中删除了一些记录。
表中的id是这样的:
99 100 101 1200 1201...
我想删除后来的记录(ID >1200),然后我想重置自动增量,以便下一个自动生成的ID将是102。所以我的记录是顺序的,有办法做到这一点在SQL Server?
当前回答
一些答案建议使用这样的语句:
DBCC CHECKIDENT (mytable, RESEED, 0)
但是OP说“删除了一些记录”,可能不是所有的记录,所以0的值并不总是正确的。另一个答案建议自动找到最大当前值并重新播种到该值,但如果表中没有记录,则会遇到麻烦,因此max()将返回NULL。一个评论建议使用简单
DBCC CHECKIDENT (mytable)
重置值,但另一个注释正确地指出,这只会将值增加到表中已经存在的最大值;如果它已经高于表中的最大值,这将不会减少该值,而这正是OP想要做的。
一个更好的解决方案结合了这些想法。第一个CHECKIDENT将值重置为0,第二个CHECKIDENT将其重置为表中当前的最大值,以防表中有记录:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
正如多条注释所指出的,确保其他表中没有指向已删除记录的外键。否则,这些外键将指向您在重新播种表后创建的记录,这几乎肯定不是您想要的。
其他回答
我想添加这个答案是因为DBCC checkident -方法在对表使用模式时会产生问题。用这个来确定:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
如果需要检查操作是否成功,请使用
SELECT IDENT_CURRENT(@Table);
在上面的例子中应该输出0。
半保证没有白痴:
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
执行以下命令重新播种mytable,使其从1开始:
DBCC CHECKIDENT (mytable, RESEED, 0)
在联机书籍(BOL, SQL帮助)中阅读它。还要注意,你的记录不要高于你所设置的种子。
基于已接受的答案,对于那些遇到类似问题的人,具有完整的模式限定:
([MyDataBase]。[MySchemaName]。[MyTable])……导致一个错误,您需要在该DB的上下文中
也就是说,下面的代码会抛出一个错误:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
用单引号括起全限定表名:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
删除数据库中的所有表并重新播种。
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.