我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。
但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。
如何在删除记录后重置标识列,使该列具有升序数字顺序?
标识列在数据库中的任何地方都不能用作外键。
我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。
但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。
如何在删除记录后重置标识列,使该列具有升序数字顺序?
标识列在数据库中的任何地方都不能用作外键。
当前回答
发出2号命令就可以做到这一点
DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)
第一个将标识重置为零,下一个将其设置为下一个可用值 ——雅各
其他回答
删除一个表的所有行,检查表中是否有标识列,将被重新播种。
****警告:所有行将被删除。*****
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
虽然大多数答案都建议RESEED到0,但很多时候我们只需要重新播种到下一个可用的Id
declare @max int
select @max=max([Id]) from [TestTable]
if @max IS NULL --check when max is returned as null
SET @max = 0
DBCC CHECKIDENT ('[TestTable]', RESEED, @max)
这将检查表并重置到下一个ID。
虽然大多数答案都建议RESEED为0,而且有些人认为这是TRUNCATED表的缺陷,但微软有一个排除ID的解决方案
DBCC CHECKIDENT ('[TestTable]', RESEED)
这将检查表并重置到下一个ID。它从MS SQL 2005到现在都是可用的。
https://msdn.microsoft.com/en-us/library/ms176057.aspx
运行此脚本重置标识列。您需要做两个更改。用需要更新的表替换tableXYZ。此外,标识列的名称需要从临时表中删除。这在一个有35000行和3列的表上是瞬时的。显然,备份表并首先在测试环境中尝试这一点。
select *
into #temp
From tableXYZ
set identity_insert tableXYZ ON
truncate table tableXYZ
alter table #temp drop column (nameOfIdentityColumn)
set identity_insert tableXYZ OFF
insert into tableXYZ
select * from #temp
DBCC CHECKIDENT (<TableName>, reseed, 0)
这将把当前标识值设置为0。
在插入下一个值时,标识值将增加到1。