我设置了下表:
Id int
pk,唯一不为空名称 varchar(50)
不为空- 与此问题无关的其他列
在 Name
上设置的索引是唯一且非聚集的。
该设置完全符合我的要求 - 也就是说,仅插入表中尚不存在 Name
的新行,如果新行是重复的 则抛出错误名称
.
我可能对此很挑剔,但每次尝试添加重复行都会导致 SQL Server 跳过本应分配的下一个 Id
(如果新行是非重复行) 名称
。
有没有办法通过某种设置来防止这种情况发生,而无需在决定插入或拒绝之前先查询是否存在?
最佳答案
不,没有设置可以阻止身份值在插入失败时递增。
就像您所建议的,您可以通过在执行插入之前检查重复项来缓解这种情况 - 我这样做不仅是为了防止身份增加,而且也是为了防止您的 Sql Server 作为标准过程引发错误。
但是,可能还有其他特殊情况会导致插入失败...因此,如果 Id 中的间隙造成的不仅仅是美观问题,那么标识列可能不是您想要的最佳解决方案解决。
关于SQL Server : Attempting to Insert a Duplicate Record Costs an Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767322/