我有一个sqlite表,当我对数据库进行真空处理时,我需要防止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,或者我必须使用不同的名称?
rowid默认情况下是每个SQLite表的一列
如果一个表有一个由单列组成的主键,并且该列声明的类型是INTEGER(大小写混合),那么该列将成为rowid的别名。
因此,您的rowid列不会替换默认的rowid。您的密钥是默认rowid的别名。
因此,您真的不应该将列命名为rowid,因为它已经被使用过了,并且会导致"不明确的列"错误,正如您已经经历过的那样。
文档指出,如果您的表包含一些INTEGER PRIMARY KEY,那么SQLite生成的rowid将不会更改。PK不需要是rowid。