Sql server 避免标识列中的空白

Sql server 避免标识列中的空白,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我在MS SQL SERVER 2008中有一个表,我已将其主键设置为自动递增,但如果我从该表中删除任何行并在表中插入一些新行,它将从下一个标识值开始,该标识值会在标识值中产生间隙。我的程序要求所有标识或密钥都按顺序排列 比如: 赋值表总共有16行,带有序列标识(1-16),但如果我在第16位删除一个值 Delete From Assignment Where assignment_id=16; 在此操作之后,当我插入新行时 Insert into Assignment(assignmen

我在
MS SQL SERVER 2008
中有一个表,我已将其
主键设置为自动递增,但如果我从该表中删除任何行并在表中插入一些新行,它将从下一个标识值开始,该标识值会在标识值中产生间隙。我的程序要求所有标识或密钥都按顺序排列

比如: 赋值表总共有16行,带有序列标识(1-16),但如果我在第16位删除一个值

Delete From Assignment Where assignment_id=16; 
在此操作之后,当我插入新行时

Insert  into Assignment(assignment_title)Values('myassignment');
它没有将16指定为这个新值的主键,而是指定17


如何解决此问题?

这是SQL Server的标准行为。如果在示例中删除了ID=8的行,则仍然会有一个间隙


您所能做的就是在SQL Server中编写一个函数GetSmallestDreed,每次插入时都会调用该函数,从而获得最小的未分配ID。但您必须非常小心事务和ACID。

重命名或重新编号主键值不是一个好的数据库管理实践。我建议您保持主键不变,并使用需要重新编号的值创建一个单独的列索引。然后简单地创建一个触发器来运行一个例程,该例程将按照您期望的顺序对每一行重新编号,显然是通过查找“间隙”并输入它们,使其值从以前的值递增。

如果没有一些后处理逻辑来重新对行编号,您所希望的行为是不可能的

因此,请考虑以下情况:

会话1开始一个事务,插入一行(id=16),但尚未提交

会话2开始一个事务,插入一行(id=17)并提交

第1课时返回

表中是否有16个将在提交17个后决定

如果你不能在触发器中重新编号,你会陷入僵局

您可能需要做的是添加一个连续整数的行号来查询数据


标识值之间的差异不是问题

我最近遇到了同样的问题:我需要外部C#应用程序中的ID值,以便检索与ID完全相同的文件。 ==>以下是我为避免使用identity属性所做的操作,我手动输入了id值,因为它是一个小表,但如果不是您的情况,请使用SQL Server 2014序列。
使用语句UPDATE而不是delete来保持id值的有序。

如果记录是从中间删除的,那么您需要什么?是否要在删除行后重新初始化标识值?可以使用以下命令重新启动标识值:DBCC CHECKIDENT(“您的_表”,重新设置种子,0)为什么数字必须保持顺序?您对将“sequencing”列与主键分开的想法满意吗,如下所述?标识值应被视为恰好适合
int
(或其他数字)数据类型的不透明blob。如果你以任何方式依赖于身份栏的实际值,那就是你做错了。我也给你的问题重新命名了。我们有标签来告诉我们所涉及的技术。几乎每个SQL问题都会涉及一个查询。将来提问时,请尽量针对您的问题提出有效的总结。(请不要将整个问题有效地放在标题中)