sql-server主键(ID)未正确递增

时间:2017-12-13 11:03:57

标签: c# sql-server database

我正在开发一个使用C#和SQL Server 2016的项目。

在SQL Server Management Studio中,我将主键添加到现有表中,通过右键单击表并选择设计表,它工作正常。

但是一旦我添加了一些新用户并删除了一些用户,它就开始表现得很奇怪,我的意思是id=4下一个用户应该id=5但是它被赋予了id=7

SSMS的屏幕截图

enter image description here

7 个答案:

答案 0 :(得分:4)

实际上您已删除ID为5和6的用户。自动增量的计数器不会自动重置或反转。这是正常和标准的行为。

答案 1 :(得分:0)

可能已删除Id 5和6的记录

答案 2 :(得分:0)

IDENITY T-SQL

特别是'重用价值'

'对于具有特定种子/增量的给定标识属性,引擎不会重用标识值。如果特定的insert语句失败或者回滚insert语句,则消耗的标识值将丢失,并且不会再次生成。当生成后续标识值时,这可能导致间隙。 “

希望这有助于解释

答案 3 :(得分:0)

这听起来令人难以置信,但如果你想要一个递增的记录号,SQL Server就不支持你了。回滚或重新启动服务器的事务可能会在数字中留下漏洞。

如果删除一行,则必须手动实现。假设存在记录1,2和3。您删除记录2.新订单应该包含多少个数字?如果你说2,请记住这意味着订单2是在订单3之后创建的,这会让很多人感到困惑。

答案 4 :(得分:0)

可能不仅仅是记录已被删除。每次尝试将null数据放入该表时,种子都会递增。以一个非常简单的例子为例:

INSERT

希望有所帮助。

答案 5 :(得分:0)

假设您已在SQL Server中使用了身份功能。当您尝试将新记录插入到具有标识列的表中时,即使插入失败,标识值也会增加。

  • 假设我有一个表,其中标识列SeqNo的当前值为9并且增加1.
  • 我正在插入新记录但由于某些数据问题而失败。
  • 所以我修复了试图重新插入的问题。

假设在此期间没有发生其他插入,新记录的SeqNo应该是10,但它将是11.

因为如果插入失败,SQL Server将不会回滚身份种子。因此,您必须手动重新播种列

删除和插入的情况相同。我有最大SeqNo为5.I删除了SeqNo 5并插入了一条新记录,但是对于我的新记录,SeqNo将是6(或下一个标识值)

因此,如果要为标识列指定一些值,请尝试使用SET IDENTITY INSERT ON进行插入。像这样

SET IDENTITY INSERT YourTable ON

INSERT INTO YourTable(SeqNo,Name)
VALUES(5,'ABC')

SET IDENTITY INSERT YourTable OFF

答案 6 :(得分:-1)

当我们删除取消时(通过在填写表格中的值时按ESC按钮),它将其作为增量,您可以截断您的表格(

  

注意:Truncate将删除表格中的所有值