SQL Server删除ID列上的值

问题描述

在我的数据库中,有ID列,该列设置为“自动增量”

因此,当我删除一行,例如ID = 2并插入新的行ID时,其值为3。

问题是如何在删除操作上将ID返回设置为2,而不是3?

我正在使用Microsoft sql Server 2012。

解决方法

与其他数据库中的大多数其他自动增量实现一样,SQL Server的标识列不提供任何选项来“弥补”浪费数字时留下的空白(不仅可能在删除行时发生,而且在删除行时也可能发生)事务回滚或服务器重新启动时。

这是明确规定的in the documentation

列上的identity属性不能保证满足以下条件:

[...]

值的重用-对于具有特定种子/增量的给定身份属性,引擎不会重用身份值。

如果出于显示目的想要一个不断增加的值,该值在删除行时会重置,则可以在row_number()查询中使用select

select t.*,row_number() over(order by id) new_id
from mytable t

如果要定期使用该视图,则可以创建一个视图,然后可以查询该视图而不是原始表:

create view myview as
select t.*,row_number() over(order by id) new_id
from mytable t;

select * from myview;
,

您可以在删除后使用CHEKIDENT数据库控制台命令来更改表的标识值,尽管仅在删除最后一条记录时才应使用此命令。

DBCC CHECKIDENT('YourTable',RESEED,2)
,

我不认为您实际上要这样做。您现在可能看不到它,但是拥有一个标识列始终可以标识已删除的行是一件好事。

如果您需要一个列以不同的方式运行,只需创建一个新列并应用业务规则使其按您想要的方式工作。

将其命名为ID_NOGAP,然后确保没有间隙。您可以在数据访问层或通过数据库上的触发器来执行此操作(不推荐。)