【问题标题】:Reaching the end of the value pool for autogenerated (IDENTITY) fields达到自动生成 (IDENTITY) 字段的值池的末尾
【发布时间】:2011-06-13 18:05:13
【问题描述】:

大多数数据库支持 autogenerate 用于 INT 字段,主要用作该表的键。它有时被简称为id

在程序让 c# int 和数据库 INT 值不再相互支持之前多长时间,或者在 INT 值用完之前多长时间,或者这个自动生成的 id 字段有多大数据库,比方说 sqlite?

当你尝试插入一条新记录,而数据库自动生成的row id用完了,会发生什么;不再插入?

谢谢

[编辑]

您是否偶尔查看表的 ID 值?

大多数人不知道,如果由于某种原因您的应用程序执行了大量插入和删除操作,那么每次插入时都会生成一个新的ID 值。似乎数据库不会重用已删除的 ID,因此在这种情况下,如果应用程序执行大量插入和删除操作,只有 1000 记录的数据库可以用完该值!!!

我问这个问题的原因是,通常在您经常使用ID 值的应用程序中,以跟踪记录;我总是这样做。

免得说我做了这样的事情

int record_id= reader("id").value;

什么时候会出现溢出错误? 数据库INT在所有编程环境下都和int一样吗?

【问题讨论】:

  • 第 1 段我明白,第 2 和第 3 段不太明白。
  • 我觉得它属于SO。一个纯粹的技术问题。
  • 请澄清平台问题,显然您的原始问题专门引用了 SQLlite。平台在这里很重要,因为这种类型的实现细节不同。

标签: database auto-increment


【解决方案1】:

我不了解 sqlite,但对于 SQL Server,最大值如下所示:

max int (32 bit) = 2,147,483,647
max bigint (64 bit) = 9,223,372,036,854,775,807

如果您在某个时候用完了值范围,那么插入新记录的尝试将失败。它会说:

将 IDENTITY 转换为数据类型 int 时出现算术溢出错误。发生算术溢出。

同样,不知道 sqlite,但在 SQL Server 中,失败的事务也会消耗池中的值。如果您尝试插入并且包含事务被回滚,则生成的 IDENTITY 值将不会返回到池中。如果您的交易经常失败,那么这也会浪费一定比例(尽管很小)的价值。

sqlite 很可能以类似的方式工作。

【讨论】:

  • +1 指出失败的事务将消耗可用值。
【解决方案2】:

SQLite 中 INT 的最大大小是 8 字节,这是一个非常非常大的数字。我发现很难想象一个使用 SQLite 的应用程序实际上可以“用完” INT。您必须运行一些非常大的数据仓库系统才能发生这种情况,而您不会使用 SQLite 来执行此操作。所以别担心!

【讨论】:

  • 根据sqlite.org/datatypes.html SQLite 使用有符号的 32 位整数,所以你用完了大约 20 亿。仍然很难做到,但比 8 字节整数(又名 64 位整数)要容易得多。
  • @Jeremy 他确实说过 - 他一定是在宽限期内编辑了问题。请注意我和 DA 都认为他说过。
猜你喜欢
  • 2014-04-17
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多