Sql server SQL Server:在任何删除操作上重置标识

Sql server SQL Server:在任何删除操作上重置标识,sql-server,identity,dbcc,Sql Server,Identity,Dbcc,让我们举一个简单的例子。有一个名为test的表: 现在我要删除一些数据,而不重置身份日志: 插入新数据时,新id将为7: 我希望在每个delete查询中自动调用dbcccheckident函数来重置表test上的标识。所以,当我插入'Purple'时,它的id是4。有没有办法做到这一点?您可以创建一个删除触发器,然后使用 CREATE TRIGGER sampleTrigger ON dbo.test FOR DELETE AS DECLARE @maxID in

让我们举一个简单的例子。有一个名为test的表:

现在我要删除一些数据,而不重置身份日志:

插入新数据时,新id将为7:


我希望在每个delete查询中自动调用dbcccheckident函数来重置表test上的标识。所以,当我插入'Purple'时,它的id是4。有没有办法做到这一点?

您可以创建一个
删除触发器,然后使用

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


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

你为什么要这么做?如果你删除最后一个,那就行了,但是如果你删除
2
。。。您重置为
2
,然后在尝试插入
3
时会出现重复键错误。Juan是对的。但是,假设您首先检查它是否是最后一个被删除的值,您可以使用触发器实现您的目标。这是正常的,也是意料之中的。如果删除ID 4,您希望发生什么?如果执行此操作,您可能希望找到阻止其他进程的方法。例如,查询可以获取表上的应用程序锁或表锁。在没有任何并发保护的情况下,有人可能会在您查找当前最大标识的时间和您要设置新标识值的时间之间插入新行。如果您关心标识列的数值,则可能是做错了什么。您应该将它们视为恰好适合数字列的不透明二进制blob。任何其他的事情都会让你在将来感到痛苦。当多行同时受到影响时会发生什么deleting@StackUser不确定您是否看到了小提琴演示,但在那里我删除了
其中的id>3
,并且仍然将id重置为最大id值。