繁体   English   中英

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

[英]sql-server primary key (ID) does not increment correctly

我正在使用C#和SQL Server 2016进行项目。

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

但是,一旦我添加了一些新用户并删除了一些用户,它就开始表现奇怪,我的意思是在id=4下一个用户应该具有id=5但是却给了id=7

SSMS的屏幕截图

在此处输入图片说明

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

可能删除了ID为5和6的记录

IDENITY T-SQL

特别是“价值重用”

对于具有特定种子/增量的给定身份属性,身份值不会被引擎重用。 如果特定的插入语句失败或插入语句回滚,则使用的标识值将丢失并且不会再次生成。 当生成后续标识值时,这可能会导致出现间隙。

希望这有助于解释

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

如果删除行,则必须手动实现。 假设记录1、2和3存在。 您删除记录2。新订单应获得什么号码? 如果您说2,请记住这意味着订单2是在订单3之后创建的,这会使很多人感到困惑。

可能不仅是记录已被删除。 每当你尝试INSERT数据到该表中的种子会增加。 举一个非常简单的例子:

CREATE TABLE #Sample (ID int IDENTITY(1,1), String char(1));
GO
INSERT INTO #Sample (String) VALUES ('A'); --This'll get ID 1
GO
INSERT INTO #Sample (String) VALUES ('AB'); --This'll get ID 2, but fail insertion (due to truncation)
GO
INSERT INTO #Sample (String) VALUES ('C'); --This'll be ID 3.
GO
--Let's Check.
SELECT *
FROM #Sample;
GO

--The SAme is tue for Transactions.
BEGIN TRANSACTION;
INSERT INTO #Sample (String) VALUES ('Q'); --This'll get ID 4
ROLLBACK;

INSERT INTO #Sample (String) VALUES ('S'); --This'll get ID 5

SELECT *
FROM #Sample;

GO
--DELETE
--Let's delete EVERYTHING
DELETE
FROM #Sample;

INSERT INTO #Sample (String) VALUES ('A'); --This'll get ID 6, Not 1

SELECT *
FROM #Sample;
GO
--Finally, howerver, truncate:
TRUNCATE TABLE #Sample;

--Truncate RESETS the seed.
INSERT INTO #Sample (String) VALUES ('A'); --This'll be 1;

SELECT *
FROM #Sample;

GO
--Clean up
DROP TABLE #Sample;

希望能有所帮助。

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

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

假设在此期间未发生其他插入,则新记录的SeqNo应该为10,但应为11。

因为如果插入失败,SQL Server不会回滚标识种子。 因此,您将不得不手动重新设置种子列

删除和插入的情况相同。 我的最大SeqNo为5.我删除了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

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

注意:截断将从表中删除所有值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM