[英]sql-server primary key (ID) does not increment correctly
实际上,您已删除了ID为5和6的用户。自动增量计数器不会自动重置或反转。 它是正常行为和标准行为。
可能删除了ID为5和6的记录
特别是“价值重用”
对于具有特定种子/增量的给定身份属性,身份值不会被引擎重用。 如果特定的插入语句失败或插入语句回滚,则使用的标识值将丢失并且不会再次生成。 当生成后续标识值时,这可能会导致出现间隙。 “
希望这有助于解释
这听起来令人难以置信,但是如果您想要递增的记录号,则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应该为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.