【问题标题】:SQL Server: reset identity on any delete actionSQL Server:在任何删除操作上重置标识
【发布时间】: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


【解决方案1】:

你可以创建一个DELETE TRIGGER然后使用

SQL Fiddle Demo

CREATE TRIGGER sampleTrigger
    ON dbo.test
    FOR DELETE
AS
    DECLARE @maxID int;

    SELECT @maxID = MAX(id)
    FROM test;

    DBCC CHECKIDENT (test, RESEED, @maxID);
GO

所以下一个插入将使用 4。

但这又不是你真正应该担心的事情

【讨论】:

  • 删除时影响多行会发生什么
  • @StackUser 不确定你是否看过小提琴演示,但我删除了where id >3 并且仍然将 id 重置为最大 id 值。
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 2011-01-07
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多