2013-08-26 92 views
0

我有一個sqlite表,我需要保持ID不變,當我VACUUM數據庫。該文檔說VACUUM不會更改具有顯式INTEGER PRIMARY KEY的表的rowid。SQLite兩個rowid的創建時,我明確地創建一個

所以,我創建了一個表

CREATE TABLE tableName (
    "rowid" INTEGER PRIMARY KEY, 
    "updated" DATETIME DEFAULT (CURRENT_TIMESTAMP), 
    "description" TEXT 
) 

但是,使一個表有兩個ROWID列。在Firefox的SQLite管理器插件中,我看到了兩個,當我嘗試訪問Java中的結果集時,它會顯示「不明確的列:'rowid'」。有沒有辦法顯式創建rowid或我必須使用不同的名稱?

回答

3

rowid is a column of every SQLite table by default

如果一個表具有由一個單一的柱的主鍵,並且該列的聲明的類型是在上部和下部殼體的任何混合物INTEGER,則列成爲一個別名rowid。

因此,您的ROWID列不替代默認的rowid。對於默認的rowid,您的密鑰是別名

因爲這個原因,你真的不應該命名你的列rowid,因爲它已經被使用過了,並且會導致「模棱兩可的列」錯誤,就像你已經經歷過的那樣。

該文檔說,如果您的表包含某些INTEGER PRIMARY KEY,則SQLite生成的rowid將不會更改。 PK不需要是rowid。

+0

如果我這樣做,那麼我必須返回並更改我的代碼以使用id而不是rowid。可以但是... – user1404617

+0

你確定嗎?我記得在SQLite文檔中讀到,如果行定義包含一個字段「INTEGER PRIMARY KEY」,SQLite不會生成自己的內部rowid。事實上,上面的鏈接是包含該語言的文檔。 – scottb

+0

我可以建議將此部分添加到您的答案嗎? *「如果一個表的主鍵由單個列組成,並且該列的聲明類型是大小寫混合的」INTEGER「,那麼該列將成爲rowid的別名。」*我發現這部分更加澄清了這種情況。 – dic19