SQL Server:如果发生错误,则重置标识

时间:2017-07-26 14:54:32

标签: sql-server identity

我有下表:

create table testTable
(
    id int identity primary key,
    string varchar(256),
    constraint testConstraint unique(string)
)

使用以下触发器:

create trigger testTrigger 
on testTable
for delete as
begin
    declare @max_ int
    select @max_= max(id) from testTable

    if @max_ is null   
        set @max_ = 0
        DBCC CHECKIDENT ('testTable', RESEED, @max_)
end

执行以下命令:

insert into testTable(string) values ('test') --identity = 1
insert into testTable(string) values ('test') --error thrown because duplicate key but **identity = 2**
insert into testTable(string) values ('test1') --due to erroneous identity increment identity = 3

第一个插入设置identity = 1,第二个插入因为唯一(字符串)约束而抛出错误,但标识错误地设置为2

问题是如何使错误不会增加身份?

是否存在全部使用SQL Server的所有功能,其中确保以基于已经的内容的顺序方式生成身份在列/表中?因此,将捕获诸如此类的所有边缘情况。

提前致谢(:

2 个答案:

答案 0 :(得分:1)

正如其他人所提到的,不要担心来自DELETE的身份列中的差距。

如果您绝对需要一个没有间隙的增量编号,您可以在需要时在SELECT端处理它。

例如,请参阅ROW_NUMBER ...这可以与链接的时间戳列(类似SYSUTCDATETIME)上的排序一起使用,以获取行的确切添加顺序,{{ 1}},查询中包含ORDER DESC

这将 NOT 与数据绑定,因为如果行为ROW_NUMBER() d,则这些ROW_NUMBERS 更改。

答案 1 :(得分:0)

不应该有任何需要防止标识列中的空白。听起来你可能正在将业务逻辑应用于代理键,这种目的会失败。你可以像Sean Lange在评论中指出的那样做一个序列。