0

我在 ID 主键上使用了身份。然后我插入一些数据。例如。

数据 1 -> 添加成功且没有错误。 编号 1

数据 2 -> 添加成功且没有错误。 编号 2

数据 3 -> 添加失败并出现错误。

数据 4 -> 添加失败并出现错误。

数据 5 -> 添加成功且没有错误。 编号 5

可以看到 ID 从 2 跳到 5。

为什么 ??这个怎么解决??

4

4 回答 4

3

为什么会有问题?

通常,您将在主键列中使用标识。那么,这个主键就是一个代理键,这意味着它绝对没有商业价值/商业意义。这只是一个“管理”事实,这是数据库唯一标识记录所必需的。所以,这个值是什么并不重要。有差距也没关系。为什么要它们连续。

并且,假设它们是连续的——插入失败时不会出现间隙——当你删除一行并稍后插入一个行时你会怎么做?你也会填补空白吗?

于 2010-01-07T22:23:42.340 回答
0

这是设计使然,sql server 首先增加计数器然后尝试创建行,如果它失败事务(总是有隐式事务)被回滚但不重用自动增量值。这是设计使然,我会很惊讶地看到它可以避免(最终你可以调用一些命令并将值重置为当前最大值)。您始终可以使用触发器来生成此值,但这会影响性能,通常您不应该关心 auto_increment 的值,它只是一个整数,如果您稍后在应用程序中会遇到相同的情况

于 2010-01-07T18:47:52.670 回答
0

如果插入失败,对于下一次插入,您可以使用set identity_insert mytable on并使用 max(myfield)+1 手动计算下一个身份。你可能有并发问题。

但这是一个结块。缝隙没什么不好。

于 2010-01-07T22:29:49.333 回答
0

@Frederik回答了大部分问题——我只想补充一点,您正在混淆主键和业务键。发票(或其他)应由发票号标识——一个业务键,应在表中具有 UNIQUE 列。主键在这里用于标识表中的一行,并且应该由数据库(连接..)和仅由 DBA 使用。

向业务用户公开主键最终会遇到麻烦,并且数据库迟早会失去参照完整性——总是如此,人们是有创造力的。

于 2010-01-07T23:39:34.200 回答