ID列索引跳10000次。
例如:
来自索引:
[5
转到10006
和继续10007
,10008
,10009
然后转到20003
,20004
....
我如何确定ID值并像以前一样重新排列它们?
我也找到了有关Reseed函数的信息,但我不知道它是什么以及如何使用它?
我假设您使用的是身份列:
ID INT NOT NULL IDENTITY(1,1)
无法保证这将继续保持顺序。当它第一次变得更加明显时它很烦人(它似乎没有在旧版本的SQL Server中发生,但显然可能发生),但也总是设计使然。当发布2012(?)时,跳过变得非常明显。我相信您现在应该使用SEQUENCE,如果您需要维持稳定的序列,例如发票编号:
如果您执行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,则尤其如此
这不是问题。这是SQL Server的性能功能。
SQL Server旨在处理许多并发事务-想想每秒数十或数百个插入。它可以在具有多个处理器的系统上执行此操作。
在这样的环境中,将“最大值仅加1”会产生很大的开销-所有不同的处理器都必须就最大值达成共识。这涉及复杂的事务锁定或排序-这会使事情变慢。
为了防止性能瓶颈,SQL Server有时会预先分配标识值。如果不使用数字,可能会导致间隔。
如果您不喜欢此功能,可以通过使用序列和触发器分配值来解决。请注意,替代方法会影响性能。
您是否一直在运行大型删除?
删除不会重置身份,因此,如果您拥有1-10000行,然后删除了所有这些行,那么当您添加新行时,身份仍然会从10001开始。
截断不会重置身份,但始终删除所有行而不进行日志记录。
您也可以使用重新设置种子的功能来重置身份,但是在这种情况下将无济于事,因为您会慢慢增加到现有数据使用的ID。