13

我有个问题。

我的 ID Primary (IDENTITY) 配置为自动递增(类型:int)。但是,当我插入一个新行时,这个新的 id 不是连续的。怎么了?有什么解决办法吗?

编辑:

[...]
[id]int] IDENTITY(1,1) NOT NULL,
[...]
CONTRAINT [PK_Medida] PRIMARY KEY CLUSTERED
(
[id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
4

6 回答 6

21

列上的标识属性不保证以下内容

值的唯一性——必须通过使用 PRIMARY KEY 或 UNIQUE 约束或 UNIQUE 索引来强制执行唯一性。

事务中的连续值- 插入多行的事务不能保证获得行的连续值,因为表上可能会发生其他并发插入。如果值必须是连续的,则事务应在表上使用排他锁或使用 SERIALIZABLE 隔离级别。

服务器重新启动或其他故障后的连续值- SQL Server 可能出于性能原因缓存标识值,并且某些分配的值可能会在数据库故障或服务器重新启动期间丢失。这可能会导致插入时标识值出现间隙。如果间隙不可接受,则应用程序应使用带有 NOCACHE 选项的序列生成器或使用它们自己的机制来生成键值。

值的重用——对于具有特定种子/增量的给定身份属性,引擎不会重用身份值。如果特定的插入语句失败或插入语句回滚,则使用的标识值将丢失并且不会再次生成。当生成后续标识值时,这可能会导致间隙。

还,

如果频繁删除的表存在标识列,则标识值之间可能会出现间隙。如果这是一个问题,请不要使用 IDENTITY 属性。但是,为了确保没有创建间隙或填补现有间隙,请在显式输入 with 之前评估现有标识值SET IDENTITY_INSERT ON

此外,检查身份列属性并检查身份增量值。它应该是1。

在此处输入图像描述

于 2013-02-01T08:10:33.553 回答
17

不要期望身份是连续的。有许多情况可能会留下空白。将身份视为抽象数字,不要为其附加任何商业意义。

于 2013-02-01T08:07:32.120 回答
3

在以下情况下会出现差距:

  1. 记录被删除。
  2. 尝试插入新记录时发生错误(例如,非空约束错误)。标识值被无奈地跳过。
  3. 有人使用显式值(例如 identity_insert 选项)插入/更新了它。
  4. 增量值大于 1。
于 2015-03-05T03:42:57.987 回答
1

您可以通过在执行增量语句之前评估预期错误来避免此错误,或者通过使用事务使该语句永远不会执行并在出现任何错误时回滚。希望能帮助到你

于 2015-08-27T18:58:09.403 回答
0

新插入的行不再使用被删除行的自动 ID。我无法为此提供解决方案,但这就是行为。

沃特

于 2013-02-01T08:07:17.337 回答
-1

我有一个带有一些约束的表,我希望这些约束会导致大量插入语句失败。它在我的由 Identity(1,1) 处理的索引中造成了巨大的空白。

我设计的解决方案是创建一个没有 ID 列的临时表,但具有该表的所有其他列。然后,我指定一个触发器在暂存表表上运行,插入成功后,记录将传输到带有索引的实际表中。在这种情况下,ID 保留在不同的时间完成,并允许将所有值组合在一起以用于 ID。

我知道这似乎有点低效,但到目前为止它对我来说效果很好。

于 2016-01-24T16:15:22.360 回答