我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。
但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。
如何在删除记录后重置标识列,使该列具有升序数字顺序?
标识列在数据库中的任何地方都不能用作外键。
我已经将记录插入到SQL Server数据库表中。该表定义了一个主键,并且自动递增标识种子被设置为“Yes”。这样做主要是因为在SQL Azure中,每个表都必须定义一个主键和标识。
但是由于我必须从表中删除一些记录,这些表的标识种子将受到干扰,索引列(自动生成的增量为1)也将受到干扰。
如何在删除记录后重置标识列,使该列具有升序数字顺序?
标识列在数据库中的任何地方都不能用作外键。
当前回答
虽然大多数答案都建议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。
其他回答
运行此脚本重置标识列。您需要做两个更改。用需要更新的表替换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
对所有表使用这个sp:
补播“youtable”
在删除一条记录后(在触发程序中)
ALTER PROCEDURE [dbo].[RESEED](@Tabla nvarchar(100))
as
-- ********************* CREAR ESTA FUNCIÓN PRIMERO *******************************
/*
create function dbo.FN_EsIdentidad(@Tabla nvarchar(100), @Campo nvarchar(100))
returns int
as
begin
return columnproperty ( object_id ( @Tabla ), @Campo , 'IsIdentity')
end
GO
************************************************************************************
*/
declare @CampoIdentidad nvarchar(100)
SELECT @CampoIdentidad = Column_Name
--,dbo.FN_EsIdentidad(Table_Name, Column_name) as EsIdentidad,
--table_name, column_name
FROM information_schema.columns
where dbo.FN_EsIdentidad(Table_Name, Column_name) = 1
and Table_Name=@Tabla
declare @Sql nvarchar(max)
declare @OutPutNum int
set @Sql = 'Select MAX(' + @CampoIdentidad + ') From ' + @Tabla
--select @CampoIdentidad
set @sql = 'Select @ValorOut=max(' + @CampoIdentidad + ') From ' + @Tabla
declare @ParamDefinition nvarchar(max)
SET @ParamDefinition = '@ValorOut int OUTPUT'
EXECUTE sp_executesql
@SQL
,@ParamDefinition
,@ValorOut = @OutPutNum OUTPUT;
--select @OutPutNum
set @OutPutNum = coalesce(@OutPutNum ,0)
DBCC CHECKIDENT (@Tabla, RESEED, @OutputNum)
在开发过程中,我一直试图为大量的表完成这项工作,这非常有效。
DBCC CHECKIDENT('www.newsType', RESEED, 1);
DBCC CHECKIDENT('www.newsType', RESEED);
因此,您首先强制将其设置为1,然后将其设置为表中当前行的最高索引。快速和简单的休息idex。
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,该命令的文档现在已经修复。
发出2号命令就可以做到这一点
DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)
第一个将标识重置为零,下一个将其设置为下一个可用值 ——雅各