首页 > 解决方案 > 在 INTEGER 主键的情况下 SqlLite rowid 的行为

问题描述

如果我有一个非整数主键,则 rowid 是从 1 开始的自动增量。

sqlite> create table t1 (name text, documentid integer, primary key (name));
sqlite> insert into t1 (name, documentid) values ('max', 123);
sqlite> insert into t1 (name, documentid) values ('duf', 321);
sqlite> select rowid,* from t1;
1|max|123
2|duf|321

但是,如果我有一个 INTEGER 主键,则 rowid 似乎等于它。

sqlite> create table t2 (name text, xid integer, primary key (xid));
sqlite> insert into t2 (name, xid) values ('max', 123);
sqlite> insert into t2 (name, xid) values ('duf', 321);
sqlite> select rowid,* from t2;
123|max|123
321|duf|321

这对我来说是出乎意料的。我希望 rowid 表现得像第一个样本。

这是正常的行为吗?我可以让它像预期的那样工作吗?

我正在使用 SqlLite3 3.27

问题不在于值,只要它是 uniqua (必须是主要的定义)。但是在 JDBC 中,我无法再处理 ResultSet.getInt ("rowid") - 需要使用 getInt ("xid") 来使其工作。这对于具有非整数主键的表来说是异常的。

标签: sqlitejdbc

解决方案


INTEGER PRIMARY KEY只是. rowid它的作用相同(如果在插入行时遗漏,则自动分配一个值),甚至不占用数据库中的任何额外空间。rowid您可以通过其名称、 或任何其他标准别名来引用该列rowidlike oid

文档中

除了下面提到的一个例外情况,如果 rowid 表的主键由单个列组成,并且该列的声明类型为“INTEGER”(大小写任意混合),则该列将成为 rowid 的别名。这样的列通常称为“整数主键”。如果声明的类型名称恰好是“INTEGER”,则 PRIMARY KEY 列仅成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”会导致主键列表现为具有整数亲和性和唯一索引的普通表列,而不是 rowid 的别名。

如果你只是这样做

INSERT INTO t2(name) VALUES ('max');

将自动生成一个值,xid而不是像您的示例中那样显式使用插入中提供的值。


推荐阅读