sqlite - 在 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") 来使其工作。这对于具有非整数主键的表来说是异常的。
解决方案
列INTEGER PRIMARY KEY
只是. rowid
它的作用相同(如果在插入行时遗漏,则自动分配一个值),甚至不占用数据库中的任何额外空间。rowid
您可以通过其名称、 或任何其他标准别名来引用该列rowid
like oid
。
从文档中:
除了下面提到的一个例外情况,如果 rowid 表的主键由单个列组成,并且该列的声明类型为“INTEGER”(大小写任意混合),则该列将成为 rowid 的别名。这样的列通常称为“整数主键”。如果声明的类型名称恰好是“INTEGER”,则 PRIMARY KEY 列仅成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”会导致主键列表现为具有整数亲和性和唯一索引的普通表列,而不是 rowid 的别名。
如果你只是这样做
INSERT INTO t2(name) VALUES ('max');
将自动生成一个值,xid
而不是像您的示例中那样显式使用插入中提供的值。
推荐阅读
- html - 如何使右侧的 col-md-3 在 html bootstrap 4 中对齐
- javascript - 是否可以返回带有对象属性名称的数组?它被连线要求打印没有''的字符串
- python - 不能使用来自opencv的SIFT算法
- spring-boot - 无法在容器化 Docker 应用程序中读取用户上传的文件
- numpy - 扩展尺寸
- c# - 来自字节的字符串中的字节不等于原始字节
- mysql - Flutter/Laravel - 在设备上本地存储的选项
- firebase - 对于 Flutter 项目如何在 android studio 中添加 firebase 的 GoogleService-Info.plist 文件
- python - 如何使用 matplotlib 解决此显示的速度损失?
- xamarin.forms - 如何以 xamarin 形式实现瀑布集合视图?