为什么我的IDENTITY列值有差距?
我有个问题。
我的ID主(IDENTITY)被configuration为自动递增(types:int)。 但是,当我插入一个新的行,这个新的ID是不连续的。 发生什么事? 任何解决scheme
编辑:
[...] [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]
不要指望身份是连续的。 有很多情况下可以留下空隙。 考虑这个身份像一个抽象的数字,并没有附加任何商业意义。
列上的标识属性不保证以下内容 :
值的唯一性 – 唯一性必须通过使用PRIMARY KEY或UNIQUE约束或UNIQUE索引来强制执行。
事务中的连续值 – 插入多行的事务不能保证获取行的连续值,因为表中可能发生其他并发插入。 如果值必须是连续的,则事务应该在表上使用排它锁或使用SERIALIZABLE隔离级别。
服务器重新启动或其他故障后的连续值 –由于性能原因,SQL Server可能会caching标识值,并且在数据库故障或服务器重新启动期间,某些分配的值可能会丢失。 这可能导致插入时身份值的差距。 如果差距不可接受,则应用程序应该使用具有NOCACHE选项的序列生成器,或使用自己的机制生成关键值。
值的重用 – 对于具有特定种子/增量的给定身份属性,身份值不会被引擎重用。 如果某个特定的插入语句失败,或者插入语句回滚,则所消耗的标识值将丢失,并且不会再次生成。 当生成后续标识值时,这可能会导致间隙。
也,
如果对于频繁删除的表存在标识列,则标识值之间可能会出现间隙。 如果这是一个问题,请不要使用IDENTITY属性。 但是, 要确保没有空白或填补现有的空白 ,请在使用SET IDENTITY_INSERT ON
明确input之前评估现有的标识值。
另外,检查标识列属性并检查标识增量值。 它应该是1。
出现间隙时:
- logging被删除。
- 尝试插入新logging时发生错误(例如非空约束错误),无法跳过标识值。
- 有人用明确的值插入/更新它(例如,identity_insert选项)。
- 增量值大于1。
被删除的行的自动ID不再被新插入的行使用。 我不能给你一个解决scheme,但这是行为。
沃特
如果列设置为主,并且自动增量为true,则会发生这种情况,因为您可能已经删除了其中的一些行。 如果你希望它是连续的,那么你不能使用自动增量。
您可以通过在执行增量语句之前评估预期的错误来避免此错误,或者通过使用事务,以便从不执行语句,并在出现任何错误时回滚。 希望它有帮助
我有一个表有一些限制,我希望导致大量的插入语句失败。 这是造成我的索引巨大的差距,由身份(1,1)处理。
我devise的解决scheme是创build一个没有ID列的登台表,但是拥有表的所有其他列。 然后,我指定一个触发器在临时表表上运行,插入成功后,logging将被转移到具有索引的实际表中。 在这种情况下,ID保留在不同的时间完成,并允许将所有的值分组在一起用于ID。
我知道这似乎有点低效,但迄今为止我的工作非常好。