我们对具有预填充数据的测试数据库进行调查测试。但有时,对于特定测试,我们希望添加额外数据。为了不弄乱现有数据(除非有意),我们希望以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,这使得测试更加困难。
有谁知道为什么会这样?或者如何绕过这个问题?
亲切的问候, 汤姆
答案 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
语句手动设置标识值