我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。

但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。

如何在删除记录后重置标识列,使该列具有升序数字顺序?

标识列在数据库中的任何地方都不能用作外键。


当前回答

我尝试了@anil shahs的答案,它重置了身份。但是当插入新的行时,它得到了恒等式= 2。所以我把语法改为:

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

那么第一行将得到恒等式= 1。

其他回答

在开发过程中,我一直试图为大量的表完成这项工作,这非常有效。

DBCC CHECKIDENT('www.newsType', RESEED, 1);
DBCC CHECKIDENT('www.newsType', RESEED);

因此,您首先强制将其设置为1,然后将其设置为表中当前行的最高索引。快速和简单的休息idex。

我尝试了@anil shahs的答案,它重置了身份。但是当插入新的行时,它得到了恒等式= 2。所以我把语法改为:

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

那么第一行将得到恒等式= 1。

在可能的情况下使用TRUNCATE总是比删除所有记录更好,因为它也不使用日志空间。

如果我们需要删除和重置种子,请记住,如果表从未被填充,并且您使用DBCC CHECKIDENT('tablenem',RESEED,0) 那么第一条记录将得到identity = 0 如MSDN文档所述

在您的情况下,只重建索引,而不用担心丢失 级数恒等式这样的情况很常见。

删除一个表的所有行,检查表中是否有标识列,将被重新播种。

****警告:所有行将被删除。*****

Create PROCEDURE ClearTableData 
    @TableName varchar(100)
AS
    EXEC ('ALTER TABLE '+@TableName+'  NOCHECK CONSTRAINT ALL ') 
    BEGIN TRY  
        EXEC ('Truncate Table'+@TableName )
        PRINT @TableName +' rows have trancated '
    END TRY  
    BEGIN CATCH  
        EXEC ('Delete From '+@TableName )
        PRINT @TableName +' rows have deleted '
    END CATCH  
    
    IF (OBJECTPROPERTY(OBJECT_ID(@TableName), 'TableHasIdentity'))  = 1 
            DBCC CHECKIDENT (@TableName, RESEED, 0) 

    EXEC ('ALTER TABLE '+@TableName+'  CHECK CONSTRAINT ALL ') 

GO
DBCC CHECKIDENT (<TableName>, reseed, 0)

这将把当前标识值设置为0。

在插入下一个值时,标识值将增加到1。