2013-08-01 30 views
0

我正在使用python sqlite3模塊的應用程序。我的數據庫使用sqlite3提供的隱式ROWID列。我預計在刪除一些行並抽空數據庫後,ROWID將被重新排序。因爲sqlite3的正式文件中:使用python sqlite3模塊時,爲什麼在VACUUM後沒有更新ROWID?

真空命令可能會改變條目的ROWID任何表是 沒有一個明確的INTEGER PRIMARY KEY。

我的pysqlite版本是2.6.0和sqlite版本是3.5.9。有人可以告訴我爲什麼它不起作用嗎?使用真空吸塵器時應注意什麼?

P.S.我有一個獨立的sqlite,其版本是3.3.6。我測試了其中的真空聲明,並更新了ROWID。那麼罪魁禍首能成爲這個版本嗎?或者它可能是一個pysqlite的錯誤?

在此先感謝您的任何意見或建議!

+0

它只說「可能會改變」。 –

+0

@JanneKarila謝謝你的回覆。因此,'五月',這是否意味着實際實施因版本而異?甚至對於相同的版本,行爲是不可預測的? – user2346069

+0

@JanneKarila我用最新的sqlite(3.7.17)測試過它。 ROWID也不更新。所以我認爲我的第一個假設是有道理的。如果是這樣的話,你知道是否有辦法強制更新ROWID以便它們始終保持連續?謝謝。 – user2346069

回答

0

此行爲是與版本相關的。

如果您想保證重新排序,您必須自己將所有記錄複製到新表中。 (這適用於隱式和顯式ROWID。)

+0

感謝您的回覆。這真的有幫助!順便說一下,VACUUM的重新排序版本實際上是以這種方式實現的嗎? – user2346069

+0

'VACUUM'創建一個新的數據庫文件並複製所有數據。 –

+0

明白了。非常感謝,CL。 – user2346069

相關問題