【发布时间】:2016-07-21 13:43:13
【问题描述】:
让我们举一个简单的例子。有一个名为 test 的表:
现在我要删除一些数据而不重置身份日志:
当我插入新数据时,新的 id 将是 7:
我希望在每个删除查询中自动调用 DBCC CHECKIDENT 函数来重置表测试的标识。所以,当我插入“Purple”时,它的 id 将是 4。有没有办法做到这一点?
【问题讨论】:
-
为什么要这样做?如果你删除最后一个,那会起作用,但是如果你删除
2会发生什么......你重置为2然后在尝试插入3时会出现重复键错误。 -
胡安是对的。但是,假设您首先检查它是否是最后一个被删除的值,您可以使用触发器实现您的目标。
-
不要纠结于身份值的差距。这是正常的和预期的。如果您删除 ID 4,您希望发生什么?
-
如果你这样做,你可能想找到一种方法来阻止其他进程。例如,查询可以获取应用程序锁或表上的表锁。如果没有任何并发保护,有人可能会在您查找当前最大标识的时间和您要设置新标识值的时间点之间插入一个新行。
-
如果您关心标识列的 numerical 值,那么您可能做错了什么。您应该将它们视为恰好适合数字列的不透明二进制 blob。其他任何事情都会让自己承受未来的痛苦。
标签: sql-server identity dbcc