【问题标题】:Why are not ROWIDs updated after VACUUM when using python sqlite3 module?使用 python sqlite3 模块时,为什么在 VACUUM 之后不更新 ROWID?
【发布时间】:2013-08-01 07:30:29
【问题描述】:

我正在开发一个使用 python sqlite3 模块的应用程序。我的数据库使用了 sqlite3 提供的隐式 ROWID 列。我希望在删除一些行并清理数据库后对 ROWID 进行重新排序。因为在sqlite3官方文档中:

VACUUM 命令可以更改任何表中条目的 ROWID 没有明确的 INTEGER PRIMARY KEY。

我的 pysqlite 版本是 2.6.0,sqlite 版本是 3.5.9。谁能告诉我为什么它不起作用?使用吸尘器需要注意什么?

P.S. 我安装了一个独立的 sqlite,它的版本是 3.3.6。我测试了其中的真空语句,并且 ROWID 得到了更新。那么罪魁祸首可能是版本吗?还是可能是 pysqlite 的错误?

提前感谢您的任何想法或建议!

【问题讨论】:

  • 它只说“可能会改变”。
  • @JanneKarila 感谢您的回复。那么“可能”是否意味着实际实现会因版本而异?或者即使对于相同的版本,行为也是不可预测的?
  • @JanneKarila 我已经用最新的 sqlite(3.7.17) 对其进行了测试。 ROWID 也不会更新。所以我认为我的第一个假设是有道理的。如果是这种情况,您是否知道是否有任何方法可以强制更新 ROWID 以使其始终连续?谢谢。

标签: python sqlite pysqlite


【解决方案1】:

此行为取决于版本。

如果您想要保证重新排序,您必须自己将所有记录复制到一个新表中。 (这适用于隐式和显式 ROWID。)

【讨论】:

  • 感谢您的回复。这真的很有帮助!顺便说一句,VACUUM 的重新排序版本实际上是这样实现的吗?
  • VACUUM 创建一个新的数据库文件并复制所有数据。
  • 知道了。非常感谢,CL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2017-10-06
相关资源
最近更新 更多