0

我有一个 sqlite 表,当我对数据库进行VACUUM时,我需要防止 id 发生变化。文档说 VACUUM 不会更改具有显式 INTEGER PRIMARY KEY 的表的 rowid。

所以,我创建了一个表

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

但这会生成一个包含两个 rowid 列的表。在 Firefox 的 SQLite Manager 插件中,我看到了两者,当我尝试访问 Java 中的结果集时,它显示“模糊列:'rowid'”。有没有办法显式创建 rowid 或者我必须使用不同的名称?

4

1 回答 1

3

默认情况下,rowid 是每个 SQLite 表的列

如果表的主键由单个列组成,并且该列的声明类型为 INTEGER(大小写任意混合),则该列将成为 rowid 的别名。

因此,您的 rowid 列不会替换默认的 rowid。您的密钥是默认 rowid 的别名

因此,您真的不应该将列命名为 rowid,因为它已经被使用过,并且会导致“不明确的列”错误,正如您已经经历过的那样。

文档说如果您的表包含一些 INTEGER PRIMARY KEY,SQLite 生成的 rowid 将不会更改。PK 不需要是 rowid。

于 2013-08-26T21:37:03.617 回答