防止失败的插入声明下一个标识值



当一个INSERT失败进入一个具有自动自增标识字段的表时,这个标识仍然是自增的,从而在标识序列中产生空白。有办法避免这种情况吗?

唯一的方法是重新播种表或构建您自己的标识生成器

例子
CREATE TABLE test(id INT IDENTITY, bla INT)
INSERT test VALUES(1)
INSERT test VALUES('b') --fails

DBCC CHECKIDENT(test,RESEED,1) --RESEED table
INSERT test VALUES(1)
SELECT * FROM test
DROP TABLE test

在繁忙的表中,您可能会在此之后插入,并且重新播种将不再正确但你为什么需要这个?谁在乎是否有空白

左栏的随机想法:确定导致插入失败的实际原因,并根据进行验证,同时当然要意识到,由于验证和插入不是原子性的,您仍然可能会遇到失败(例如唯一字段中的重复项)。

似乎身份差距是症状,失败是疾病

一般情况下,除了标识记录外,您希望键在其背后没有任何意义。这意味着,如果编号中有空白,应该没有关系。如果要将一条记录插入到另一个相关的表中,则可以在存储过程/触发器等中使用SCOPE_IDENTITY()

最新更新