我有一个新的集群数据库,我一直在将数据从旧数据库移到表中。当我导入数据时,一切正常,但是当我手动插入记录时,身份列不跟随下一个身份号码。因此,例如,我将 100 条记录导入表中,身份列显示 1-100,但如果我随后手动向数据库添加一行,我将得到 102 或 103,而不是 101。
任何想法为什么会发生这种情况?
它发生在我所有的桌子上,并且变得非常令人沮丧,因为有时身份之间的差距高达 4 或 5。
我有一个新的集群数据库,我一直在将数据从旧数据库移到表中。当我导入数据时,一切正常,但是当我手动插入记录时,身份列不跟随下一个身份号码。因此,例如,我将 100 条记录导入表中,身份列显示 1-100,但如果我随后手动向数据库添加一行,我将得到 102 或 103,而不是 101。
任何想法为什么会发生这种情况?
它发生在我所有的桌子上,并且变得非常令人沮丧,因为有时身份之间的差距高达 4 或 5。
您不应该依赖于遵循任何特定模式的标识列(例如,始终只增加 1)。唯一的保证是表中当前的值是唯一的。
IMO,不应该注意身份列中的空白。这种代理键(与自然键相反)的全部意义在于不必担心任何类型的“正确性”。
现在,就像 Robin 所说,您可能有一些正在回滚或出错的语句,这会导致身份出现空白。
另一件可能导致差距的事情是身份本身的定义。运行这个语句,看看我的意思
Declare @MyTable table ( MyColumn1 Int Identity (1, 5))
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
SELECT * FROM @MyTable
如果您在事务和回滚中“测试”您的插入。然后你真正运行它。即使您随后回滚,事务中的插入也会将身份字段加一。
您不能依赖标识列始终是连续的,因为增量由 SQL Server 维护并且跨事务保留。尽管在更改表结构或将 SET IDENTITY_INSERT 切换为 ON 再切换回 OFF 时会重置此增量,但我不建议这样做。
如果你真的依赖顺序 ID,你应该创建一个非标识列并编写自己的逻辑以确保它保持顺序。
如果您通过 SSMS 添加行并且您尝试插入该行并遇到任何类型的约束违规(即数据类型违规或外键违规),即使该行未成功插入到表中,标识也会增加 1。这可能是怎么回事?