问题描述
因此,当我删除一行,例如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,然后确保没有间隙。您可以在数据访问层或通过数据库上的触发器来执行此操作(不推荐。)