SQL列ID值跳跃10000次
SQL Column ID value jumps 10000 times
ID列索引跳转10000次。
For example:
来自 index :
5
转到 10006
然后继续 10007
, 10008
, 10009
然后去 20003
, 20004
....
如何修复 ID 值并像以前一样重新排列它们?
我还找到了一些关于 Reseed 函数的信息,但我不知道它是什么以及如何使用它?
这不是问题。这是 SQL 服务器的性能特征。
SQL 服务器旨在处理许多并发事务——想想每秒数十或数百次插入。它可以在具有多个处理器的系统上执行此操作。
在这样的环境中,"adding just 1" 到最大值可能会有很多开销——所有不同的处理器都必须就最大值达成一致。这涉及复杂的事务锁定或排序——这会减慢速度。
为了防止性能瓶颈,SQL 服务器有时会预先分配标识值。如果不使用这些数字,这可能会导致出现空白。
如果您不喜欢此功能,可以通过使用序列和触发器来分配值来解决它。请注意,替代方法会对性能产生影响。
我假设您使用的是标识列:
ID INT NOT NULL IDENTITY(1,1)
不能保证这会保持顺序。当它第一次变得更加明显时很烦人(它似乎没有发生在旧版本的 SQL 服务器中,但显然可能发生)但也总是设计使然。当 2012 (?) 发布时,跳过变得非常明显。你现在应该使用 SEQUENCE 我相信是否需要保持稳定的序列 - 例如发票编号:
如果您执行 INSERT 并且它失败了,它也可能会出现跳过,但这通常只会跳过 1 个。这一直在发生并且是设计使然——你需要重新植入你的身份来克服这个问题。类似于:
DBCC CHECKIDENT ("dbo.MyTable", RESEED, 10)
如果另一个跳过也没有发生,将使下一个身份号码为 11。
编辑:
关于重新对齐现有条目,我不是 DB 专家,但前几天我确实在 table 上使用相当基本的方法进行了此操作 - 但它只是一个很小的 table - 可能有更好的方法:
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
请记住,如果您有外键或其他引用,截断将不起作用,您将不得不做更多的事情complex.Particularly如果您有外键引用现有不正确的 ID
你有运行大删吗?
删除不会重置身份,因此如果您有第 1-10000 行,然后删除所有行,当您添加新行时,身份仍会从 10001 继续。
Truncate 确实会重置标识,但总是在不记录的情况下删除所有行。
您也可以使用 reseed 函数来重置身份,但对这种情况没有帮助,因为您会慢慢递增回现有数据使用的 ID。
ID列索引跳转10000次。
For example:
来自 index :
5
转到10006
然后继续
10007
,10008
,10009
然后去
20003
,20004
....
如何修复 ID 值并像以前一样重新排列它们?
我还找到了一些关于 Reseed 函数的信息,但我不知道它是什么以及如何使用它?
这不是问题。这是 SQL 服务器的性能特征。
SQL 服务器旨在处理许多并发事务——想想每秒数十或数百次插入。它可以在具有多个处理器的系统上执行此操作。
在这样的环境中,"adding just 1" 到最大值可能会有很多开销——所有不同的处理器都必须就最大值达成一致。这涉及复杂的事务锁定或排序——这会减慢速度。
为了防止性能瓶颈,SQL 服务器有时会预先分配标识值。如果不使用这些数字,这可能会导致出现空白。
如果您不喜欢此功能,可以通过使用序列和触发器来分配值来解决它。请注意,替代方法会对性能产生影响。
我假设您使用的是标识列:
ID INT NOT NULL IDENTITY(1,1)
不能保证这会保持顺序。当它第一次变得更加明显时很烦人(它似乎没有发生在旧版本的 SQL 服务器中,但显然可能发生)但也总是设计使然。当 2012 (?) 发布时,跳过变得非常明显。你现在应该使用 SEQUENCE 我相信是否需要保持稳定的序列 - 例如发票编号:
如果您执行 INSERT 并且它失败了,它也可能会出现跳过,但这通常只会跳过 1 个。这一直在发生并且是设计使然——你需要重新植入你的身份来克服这个问题。类似于:
DBCC CHECKIDENT ("dbo.MyTable", RESEED, 10)
如果另一个跳过也没有发生,将使下一个身份号码为 11。
编辑: 关于重新对齐现有条目,我不是 DB 专家,但前几天我确实在 table 上使用相当基本的方法进行了此操作 - 但它只是一个很小的 table - 可能有更好的方法:
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
请记住,如果您有外键或其他引用,截断将不起作用,您将不得不做更多的事情complex.Particularly如果您有外键引用现有不正确的 ID
你有运行大删吗?
删除不会重置身份,因此如果您有第 1-10000 行,然后删除所有行,当您添加新行时,身份仍会从 10001 继续。
Truncate 确实会重置标识,但总是在不记录的情况下删除所有行。
您也可以使用 reseed 函数来重置身份,但对这种情况没有帮助,因为您会慢慢递增回现有数据使用的 ID。