身份有时候SEED,有时SEED +1

时间:2014-03-21 16:18:59

标签: sql sql-server identity

我们对具有预填充数据的测试数据库进行调查测试。但有时,对于特定测试,我们希望添加额外数据。为了不弄乱现有数据(除非有意),我们希望以ID 300001开始额外的条目。

USE DB

EXEC sp_MSForEachTable @command1 = 

'IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1
BEGIN
 DBCC CHECKIDENT (''?'', RESEED, 300000);
 DBCC CHECKIDENT (''?'', RESEED, 300000);
END'
GO

然而,在发生这种情况之后插入新条目后,一些表格分发了ID 300000,有些表格分发300001,这使得测试更加困难。

有谁知道为什么会这样?或者如何绕过这个问题?

亲切的问候, 汤姆

2 个答案:

答案 0 :(得分:3)

根据MSDN:

  

当前标识值设置为new_reseed_value。如果没有行   自表创建以来,或者如果全部已插入表中   已使用TRUNCATE TABLE语句删除行   运行DBCC后插入的第一行CHECKIDENT使用new_reseed_value   作为身份。否则,插入的下一行使用   new_reseed_value +当前增量值。

因此,如果您想要一致的行为,请在重新播种之前插入/删除每个表中的一行。

但是,我想指出你不应该依赖具有任何模式的标识列。虽然在实践中身份在某种程度上表现,但它并不能保证。一个典型的场景是事务A创建一些新行,事务B创建更多,然后滚动事务A返回并提交B产生一个间隙。

答案 1 :(得分:2)

除了Luann的答案,您可以使用

绕过它
 set identity_insert [tablename] on 

并通过insert语句手动设置标识值