我已经从SQL Server数据库的一个表中删除了一些记录。
在表中,ID看起来像这样:
99 100 101 1200 1201...
我想删除后面的记录(IDs > 1200),然后重置自动增量,使下一个自动生成的ID为102。这样我的记录将是连续的。在SQL Server中是否有方法可以实现这一点?
我已经从SQL Server数据库的一个表中删除了一些记录。
在表中,ID看起来像这样:
99 100 101 1200 1201...
我想删除后面的记录(IDs > 1200),然后重置自动增量,使下一个自动生成的ID为102。这样我的记录将是连续的。在SQL Server中是否有方法可以实现这一点?
运行以下命令来重新生成mytable并从1开始:
DBCC CHECKIDENT (mytable, RESEED, 0)
在Books on Line(BOL,SQL帮助)中阅读相关信息。此外,请注意不要设置高于您所设置的种子记录。
DBCC CHECKIDENT (mytable, RESEED, 0)
。请注意,此操作只会重新设置标识列的起始值,并不会更改任何现有行的标识值。 - Ryan LundyDBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
如果number等于0,则在下一次插入时自动递增字段将包含值1。
如果number等于101,则在下一次插入时,自动递增字段将包含值102。
一些额外的信息...对您可能有用
在上面的查询中给出自动递增的number
之前,您必须确保现有表的自动递增列包含小于number
的值。
要从表(table1)获取列(column_name)的最大值,可以使用以下查询
SELECT MAX(column_name) FROM table1
DBCC CHECKIDENT('databasename.dbo.tablename')
,不要包括, RESEED, number
? - Sam半智能化的:
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
如果你正在使用MySQL,尝试这样做:
ALTER TABLE tablename AUTO_INCREMENT = 1
我想到了解决方法。它是:
DBCC CHECKIDENT ('tablename', RESEED, newseed)
删除并重置数据库中的所有表。
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]
)...会导致错误,你需要在该数据库的上下文中。
也就是说,以下代码会报错:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
请使用单引号将完全限定的表名括起来:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
有多个答案建议使用类似这样的语句:
DBCC CHECKIDENT (mytable, RESEED, 0)
但是原帖中提到“删除了一些记录”,这可能并不是所有的记录,因此值为0并不总是正确的。另一个答案建议自动查找最大当前值并将其重新设定为种子值,但如果表格中没有记录,则会出现问题,因此max()函数将返回NULL。有人评论建议简单地使用
DBCC CHECKIDENT (mytable)
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
。将数据库中每个键重置为自增,从上一个最高键的最大值开始:
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)'
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED)'