我正在使用sql server 2012,在我的数据库中我已经在userid上设置了primaykey我也设置了身份规范是,身份是,身份增量1和身份种子1。
我只插入5个用户,userid为1,2,3,4,5。我确信在那之后我没有进行任何插入,没有其他sp或触发器正在使用此表。这只是一张新桌子。现在,当我尝试插入第6个用户时,它已插入的用户ID为1001。 在2002年第7期和第8期, 为什么会这样跳进用户标识?
答案 0 :(得分:1)
通常在以下时间出现差距:
NullPointerException
列上的标识属性不保证以下内容:
1. records are deleted.
2. error has occurred when attempting to insert a new record (e.g. not-null constraint error).the identity value is helplessly skipped.
3. somebody has inserted/updated it with explicit value (e.g. identity_insert option).
4. incremental value is more than 1.
- 必须使用PRIMARY KEY或UNIQUE约束或UNIQUE索引来强制执行唯一性。
Uniqueness of the value
- 插入多行的事务不能保证获得行的连续值,因为表上可能会出现其他并发插入。如果值必须是连续的,那么事务应该使用表上的独占锁或使用SERIALIZABLE隔离级别。
Consecutive values within a transaction
-SQL Server可能出于性能原因而缓存标识值,并且在数据库故障或服务器重新启动期间,某些分配的值可能会丢失。这可能导致插入时身份值的缺口。如果间隙不可接受,则应用程序应使用带有NOCACHE选项的序列生成器,或使用自己的机制生成键值。
Consecutive values after server restart or other failures
- 对于具有特定种子/增量的给定标识属性,引擎不会重用标识值。如果特定的insert语句失败或者回滚insert语句,则消耗的标识值将丢失,并且不会再次生成。生成后续标识值时,这可能会导致间隙。
此外,
如果存在经常删除的表的标识列,则标识值之间可能会出现间隙。如果这是一个问题,请不要使用IDENTITY属性。但是,要确保没有创建间隙或填充现有间隙,请在显式输入SET IDENTITY_INSERT ON之前评估现有标识值。
另外,检查标识列属性&检查身份增量值。它应该是1。
答案 1 :(得分:0)
在设计视图中打开您的表格
现在检查Identity Seed和Identity Increment值是否正确。如果没有,那么你必须纠正它们。