当前位置: 首页 > 面试题库 >

自动增加主要的计数差距

籍永安
2023-03-14
问题内容

我有一个带有自动递增主键的表。该表旨在存储数百万条记录,我现在不需要删除任何内容。问题是,当插入新行时,由于某些错误,自动增量键在自动增量ID中保留了一些间隙。例如,在5之后,下一个ID为8,而间隙为6和7
。结果是当我计算行数时,结果为28000,但最大id为58000。我没有删除任何内容。以及如何解决此问题。

PS我在插入记录时使用插入忽略,以便当我尝试在唯一列中插入重复项时不会出现错误。


问题答案:

这是设计使然,将永远发生。

为什么?

让我们以两个正在执行INSERT的重叠事务为例

  • 事务1执行INSERT,获取值(比方说42),执行更多工作
  • 事务2执行INSERT,获取值43,执行更多工作

然后

  • 事务1失败。回滚。42未使用
  • 交易2完成43

如果保证了连续的值,则每笔交易都必须接连发生。伸缩性不是很好。

另请参阅“插入记录是否始终接收连续的标识值”(SQL
Server,但适用相同的原理)



 类似资料:
  • 问题内容: 是否可以在不将SQL Server主列作为主键的情况下自动对其进行递增? 如果是,该怎么做。 谢谢 问题答案: 是的。不需要将列设为主键。 虽然我不确定这何时会有用。如果您有一个要用作PK的自然键,那么您可能还是想对代理替代键施加一个唯一约束。 出于建立FK关系的目的,SQL Server不在乎该列是否为PK,它只需要在其上具有唯一索引即可。

  • 我有一个Ruby网络应用程序在赫洛库上运行,有一个Postgres数据库。我注意到自动递增的ID在Postgres数据库被Heroku“维护”时有一个间隙。 差距是一次性的,然后ID再次增加1。像这样: Heroku的维护发生在两个记录(和)之间,于创建。 我看到了一个解释,即失败的事务将导致下一次成功提交时跳过一个ID,但我在应用程序日志中看不到任何指示当时正在创建任何记录的内容。

  • 问题内容: 我想在ala SQL Server列中实现标识或自动递增值: 如何才能做到这一点? 问题答案: 正如Orbman所说,实现此目标的标准方法是使用序列。大多数人也将其与插入触发器结合在一起。因此,当插入没有ID的行时,触发器将触发以从序列中为您填写ID。 这是在Oracle中使用触发器的少数情况之一。

  • 我将向一个SQL Server表中添加一行,该表的主键列是自动递增的(< code>identity)。当我以编程方式向表中插入一个新行时,有没有办法获得所添加行的键值,因为我想在另一个相关表中将它用作外键?

  • 问题内容: 我正在将我的mysql db表从id(自动)更改为uid。 这是我得到的错误。 据我了解,我需要将ID更改为非自动增量,因为我将其作为主键了。更改列以删除主键和自动递增的语法是什么? 问题答案: 如果您需要在单个SQL语句中从列中删除自动增量和主键,则应该这样做: 实际上,您应该能够在单个查询中完成所有操作:

  • 你们能帮帮我吗,我的主键无法自动递增,我的表名是books,我想自动递增的列是serial_no,这是主键。 这是五月按钮,当我输入所有数据时,它将被提交到我的台本上 顺便说一句,我找到了另一种方法,抓取我的表并重建它,然后将代码放入create table脚本中 SERIAL_NOINTEGER默认AUTOINCREment:开始1增量1不是空主键