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

时间:2011-05-03 18:52:05

标签: c# sql sql-server-2005

INSERT无法进入具有自动递增标识字段的表时,标识仍然会递增,从而在标识序列中产生间隙。有没有办法避免这种情况?

3 个答案:

答案 0 :(得分:3)

执行此操作的唯一方法是重新设置表或构建自己的标识生成器

例如

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

在繁忙的桌子上,您可能会在此之后获得插入,并且重新设定将不再正确 但你为什么需要这个呢?谁在乎是否存在差距

答案 1 :(得分:1)

来自左侧字段的随机构思:确定实际导致失败的插入的内容并验证 ,同时当然意识到由于验证和插入不是原子的,您可能仍然会失败(对于诸如独特字段中的重复之类的东西)。

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

答案 2 :(得分:0)

一般来说,除了识别记录之外,您希望密钥没有任何意义。这意味着如果编号中存在空白,则无关紧要。如果要将记录插入另一个相关表,则可以在存储的proc / trigger等中使用SCOPE_IDENTITY()