为什么sql server增加了Identity规范?

时间:2016-03-18 13:06:20

标签: sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2

我正在使用sql server 2012,在我的数据库中我已经在userid上设置了primaykey我也设置了身份规范是,身份是,身份增量1和身份种子1。

我只插入5个用户,userid为1,2,3,4,5。我确信在那之后我没有进行任何插入,没有其他sp或触发器正在使用此表。这只是一张新桌子。现在,当我尝试插入第6个用户时,它已插入的用户ID为1001。 在2002年第7期和第8期, 为什么会这样跳进用户标识?

2 个答案:

答案 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值是否正确。如果没有,那么你必须纠正它们。