当INSERT
无法进入具有自动递增标识字段的表时,标识仍然会递增,从而在标识序列中产生间隙。有没有办法避免这种情况?
答案 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()
。