SQL列ID值跳10000次

问题描述 投票:0回答:3

ID列索引跳10000次。

例如:

来自索引

  • [5转到10006

  • 和继续100071000810009

  • 然后转到2000320004 ....

我如何确定ID值并像以前一样重新排列它们?

我也找到了有关Reseed函数的信息,但我不知道它是什么以及如何使用它?

sql sql-server indexing id
3个回答
2
投票

我假设您使用的是身份列:

ID INT NOT NULL IDENTITY(1,1)

无法保证这将继续保持顺序。当它第一次变得更加明显时它很烦人(它似乎没有在旧版本的SQL Server中发生,但显然可能发生),但也总是设计使然。当发布2012(?)时,跳过变得非常明显。我相信您现在应该使用SEQUENCE,如果您需要维持稳定的序列,例如发票编号:

https://dba.stackexchange.com/questions/62151/what-could-cause-an-auto-increment-primary-key-to-skip-numbers

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15

如果您执行INSERT并且失败,它似乎也会跳过,但是通常只会跳过1。这一直是发生的,并且是设计使然-您需要重新设定身份以克服这一问题。类似于:

DBCC CHECKIDENT ("dbo.MyTable", RESEED, 10)

如果没有其他跳过也将使下一个标识号11。

编辑:关于重新排列现有条目,我不是数据库专家,但前几天我在表上使用相当简单的方法进行了此操作-但这只是一个小表-可能有更好的方法:

BEGIN TRAN

--CREATE TEMP TABLE
DECLARE @Tooltip TABLE
(
    [TooltipId] INT NOT NULL,
    [TooltipKey] NVARCHAR(100) NOT NULL,
    [Name] NVARCHAR(255) NOT NULL
)

--INSERT EXISTING INTO TEMP TABLE
INSERT INTO @Tooltip (TooltipKey, Name )
SELECT TooltipKey, Name
FROM dbo.Tooltip
ORDER BY TooltipId


--CLEAR ACTUAL TABLE
TRUNCATE TABLE dbo.Tooltip

--RESET IDENTITY TO 1
DBCC CHECKIDENT ("dbo.Tooltip", RESEED, 1)

--REINSERT FROM TEMP TABLE INTO ACTUAL TABLE
INSERT INTO dbo.Tooltip (TooltipKey, Name )
SELECT TooltipKey, Name
FROM @Tooltip
ORDER BY TooltipId

--TEST OUTPUT
SELECT * FROM dbo.Tooltip

--DO THIS FOR TESTING
ROLLBACK TRAN

--DO THIS WHEN YOU'RE CERTAIN YOU WANT TO PERFORM THE ACTION
--COMMIT TRAN

请记住,如果您有外键或其他引用,则截断将不起作用,并且您将不得不做一些更复杂的事情。特别是如果您的外键引用了您现有的不正确ID,则尤其如此


0
投票

这不是问题。这是SQL Server的性能功能。

SQL Server旨在处理许多并发事务-想想每秒数十或数百个插入。它可以在具有多个处理器的系统上执行此操作。

在这样的环境中,将“最大值仅加1”会产生很大的开销-所有不同的处理器都必须就最大值达成共识。这涉及复杂的事务锁定或排序-这会使事情变慢。

为了防止性能瓶颈,SQL Server有时会预先分配标识值。如果不使用数字,可能会导致间隔。

如果您不喜欢此功能,可以通过使用序列和触发器分配值来解决。请注意,替代方法会影响性能。


0
投票

您是否一直在运行大型删除?

删除不会重置身份,因此,如果您拥有1-10000行,然后删除了所有这些行,那么当您添加新行时,身份仍然会从10001开始。

截断不会重置身份,但始终删除所有行而不进行日志记录。

您也可以使用重新设置种子的功能来重置身份,但是在这种情况下将无济于事,因为您会慢慢增加到现有数据使用的ID。

© www.soinside.com 2019 - 2024. All rights reserved.