我有下表:
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的所有功能,其中确保以基于已经的内容的顺序方式生成身份在列/表中?因此,将捕获诸如此类的所有边缘情况。
提前致谢(:
答案 0 :(得分:1)
正如其他人所提到的,不要担心来自DELETE
的身份列中的差距。
如果您绝对需要一个没有间隙的增量编号,您可以在需要时在SELECT端处理它。
例如,请参阅ROW_NUMBER ...这可以与链接的时间戳列(类似SYSUTCDATETIME)上的排序一起使用,以获取行的确切添加顺序,{{ 1}},查询中包含ORDER DESC
。
这将 NOT 与数据绑定,因为如果行为ROW_NUMBER()
d,则这些ROW_NUMBERS 将更改。
答案 1 :(得分:0)
不应该有任何需要防止标识列中的空白。听起来你可能正在将业务逻辑应用于代理键,这种目的会失败。你可以像Sean Lange在评论中指出的那样做一个序列。