1

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

喜欢:分配表共有 16 行序列标识(1-16),但如果我删除第 16 位的值

Delete From Assignment Where assignment_id=16; 

在此操作之后,当我插入新行时

Insert  into Assignment(assignment_title)Values('myassignment');

它没有将 16 作为主键分配给这个新值,而是分配 17。

我怎么解决这个问题 ?

4

4 回答 4

3

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

于 2013-06-17T06:09:03.577 回答
0

如果没有一些后处理逻辑来重新编号行,您想要的行为是不可能的。

考虑这样的情况:

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

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

Session1 回滚。

表中是否存在 16 是在提交 17 之后决定的。

而且你不能在触发器中重新编号,你会陷入僵局。

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

身份价值的差距不是问题

于 2013-06-17T06:54:32.100 回答
0

这是 SQL Server 的标准行为。如果您在示例中删除了 ID=8 的行,您仍然会有差距。

您所能做的就是在 SQL Server 中编写一个函数 getSmallestDreeID,您为每个插入调用该函数,这将为您提供最小的未分配 ID。但是您必须非常注意事务和 ACID。

于 2013-06-17T06:06:08.667 回答
0

好吧,我最近遇到了同样的问题:我需要外部 C# 应用程序中的 ID 值才能检索与 ID 完全相同命名的文件。==>这是我为避免身份属性所做的,我手动输入了 id 值,因为它是一个小表,但如果不是你的情况,请使用 SEQUENCE SQL Server 2014。使用语句 UPDATE 而不是 delete 到保持 id 值有序。

于 2016-11-15T12:53:07.617 回答