2011-06-13 24 views
0

对于INT字段,大多数数据库支持autogenerate,主要用作该表的键。它有时候简称为id达到自动生成(IDENTITY)字段值池的末尾

多的时间之前该程序可以说C#int和数据库INT值不再相互支持,要不了多久,使用前INT值了,或者有多大这个自动生成的ID字段数据库如何,让我们说sqlite?

当您尝试插入新记录并且数据库自动生成的行ID用完时,会发生什么;没有更多的插入?

感谢

[编辑]

你看看你的表的ID值,过一段时间?

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

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

免得说我没这样

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

财产以后,当我将得到一个溢出错误? 数据库INT与所有编程环境中的int相同?

+0

第一段我明白,第二和第三不太多。 – Marcelo 2011-06-13 18:06:53

+2

我觉得它属于SO。纯技术问题。 – 2011-06-13 18:35:08

+0

请说明平台的问题,显然你的原始问题具体参考了SQLlite。平台确实很重要,因为这种类型的实现细节有所不同。 – Jeremy 2011-06-13 20:37:58

回答

4

我不知道,但源码为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以类似的方式工作。

+0

+1表示失败的事务会消耗可用的值。 – 2011-06-13 22:56:41

2

SQLite中INT的最大大小是8个字节,这是一个非常非常大的数字。我发现很难想象一个使用SQLite的应用程序,实际上你可能会“耗尽”INT。你将不得不运行一些非常大的数据仓库系统来实现这一点,你不会用SQLite来做这件事。所以,别担心!

+1

根据http://www.sqlite.org/datatypes.html SQLite使用带符号的32位整数,所以你用完了20亿左右。仍然很难做到,但比8字节整数(又称64位整数)要容易得多。 – btilly 2011-06-13 18:42:28

+0

他说他在使用sqllite在哪里?我在这里错过了一些...... – Jeremy 2011-06-13 20:02:11

+0

@Jeremy他确实这么说 - 他必须在宽限期内编辑这个问题。注意到我和DA都认为他是这么说的。 – 2011-06-13 20:05:27