我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。
但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。
如何在删除记录后重置标识列,使该列具有升序数字顺序?
标识列在数据库中的任何地方都不能用作外键。
我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。
但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。
如何在删除记录后重置标识列,使该列具有升序数字顺序?
标识列在数据库中的任何地方都不能用作外键。
当前回答
DBCC CHECKIDENT management命令用于重置标识计数器。命令格式为:
DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]
例子:
DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO
以前版本的Azure SQL数据库不支持,但现在支持了。
多亏了Solomon Rutzky,该命令的文档现在已经修复。
其他回答
重新播种到0是不太实际的,除非您要清理整个表。
除此之外,安东尼·雷蒙德给出的答案是完美的。首先得到单位列的最大值,然后用max作为种子。
DBCC CHECKIDENT ('TestTable', RESEED, 0)
GO
其中0是标识起始值
用新id重置标识列
DECLARE @MAX INT
SELECT @MAX=ISNULL(MAX(Id),0) FROM [TestTable]
DBCC CHECKIDENT ('[TestTable]', RESEED,@MAX)
删除一个表的所有行,检查表中是否有标识列,将被重新播种。
****警告:所有行将被删除。*****
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 management命令用于重置标识计数器。命令格式为:
DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]
例子:
DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO
以前版本的Azure SQL数据库不支持,但现在支持了。
多亏了Solomon Rutzky,该命令的文档现在已经修复。