我有一个新的集群数据库,我一直在从旧数据库中将数据移入表中。当我导入数据时,一切正常,但是当我手动插入记录时,Identity列不会跟随下一个标识号。因此,例如,我将100条记录导入到表中,而Identity列显示为1-100,但如果我然后手动向数据库添加一行,我将得到102或103,而不是101.
为什么会发生这种情况?
我的所有桌子都在发生这种情况,并且它变得非常令人沮丧,因为有时身份之间的差距达到4或5。
答案 0 :(得分:2)
您不应该依赖于任何特定模式之后的标识列(例如,总是仅增加1)。唯一的保证是表中当前的值将是唯一的。
答案 1 :(得分:2)
现在,就像罗宾所说的那样,你可能会有一些回滚或错误的陈述,这会导致身份上的差距。
另一个可能导致差距的因素是身份本身的定义。运行此语句,看看我的意思
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
答案 2 :(得分:1)
如果您在事务和回滚中“测试”插入内容。然后你真实地运行它。即使您随后回滚,事务中的插入也会将标识字段增加1。
答案 3 :(得分:0)
您不能依赖Identity列始终是顺序的,因为SQL Server维护的增量在事务中保留。虽然在更改表结构或将SET IDENTITY_INSERT切换为ON并返回OFF时重置此增量,但我不建议。
如果您真的依赖于顺序ID,则应创建一个非标识列并编写自己的逻辑以确保它保持顺序。
答案 4 :(得分:0)
如果要通过SSMS添加行并尝试插入行并遇到任何类型的约束违规(即数据类型违规或外键冲突),即使该行未成功插入,标识也会增加1桌子。这可能是发生了什么?