2011-06-13 30 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