2010-07-31 32 views
101

當一個整數列被標記爲SQLite表中的主鍵時,是否應該爲它明確創建一個索引? SQLite似乎沒有爲主鍵列自動創建一個索引,但是它的目的可能是索引它呢? (我會一直在這個專欄上搜索)。SQLite中的主鍵是否需要索引?

字符串主鍵的情況會不同嗎?

回答

112

It does it for you.

INTEGER主鍵列之外,既獨特又PRIMARY KEY 約束通過在數據庫中創建一個索引來實現(在 以同樣的方式爲 「CREATE UNIQUE INDEX」 將語句)。這樣的 索引與數據庫中的任何其他索引一樣用於優化 查詢。因此,在一組已經使用UNIQUE或PRIMARY KEY約束的列已經創建索引的情況下,通常沒有任何優勢(但重要的開銷)。

+5

事實上,它說:「主鍵屬性通常產生於被指定作爲主鍵列或列的唯一索引」。但是,該索引在SQLite管理應用程序中不可見,這就是爲什麼我問。 – 2010-07-31 18:26:11

+1

在'sqlite_master'表中提及名稱以'sqlite_autoindex_'開頭的表。 – dan04 2010-07-31 19:17:14

+1

這意味着,與mysql不同的是,當您創建外鍵時,您經常需要添加索引。是嗎 ? – 2012-06-19 10:16:43

7

數據庫將始終靜默地爲唯一主鍵創建索引,以便在內部檢查它是否有效。

創建它後,它會在必要時使用它。

當然,它不會總是聚集在一起,並且如果您希望它通常在模式中指定。

7

如果一列標記爲INTEGER PRIMARY KEY,實際上它大約是通過指定任何其他PRIMARY KEY或索引值進行的類似搜索的左右。這是因爲:

... SQLite表中的所有行都有一個64位有符號整數鍵,用於唯一標識其表中的行...搜索具有特定rowid或所有記錄的記錄在指定範圍內的rowid大約是通過指定任何其他PRIMARY KEY或索引值進行的類似搜索的兩倍。

有一個例外下文指出,如果一個rowid表具有主密鑰由單個列和該列的聲明的類型是在上部和下部殼體的任何混合物「INTEGER」則列成爲rowid的別名。

這樣的列通常被稱爲「整數主鍵」。 A 如果聲明的 類型名稱完全是「INTEGER」,則PRIMARY KEY列只能成爲整數主鍵。其他整數類型名稱(如「INT」或 「BIGINT」或「SHORT INTEGER」或「UNSIGNED INTEGER」)會導致主鍵 的行爲與具有整數關聯性 和唯一索引的普通表列不同, rowid。

參見:http://www.sqlite.org/lang_createtable.html#rowid

相關問題