sqlite - 数据库中的目标行
问题描述
我在定位数据库中的特定行时遇到问题
我希望能够从表联系人中选择 WHERE rownumber = 5(例如)
select * from Contacts WHERE RowNum = 5
这不起作用,但是它应该选择行号为 5 的数据。
编辑:这现在是固定的,正确的代码是:
("select rowid, * from Contacts WHERE rowid = $num+1")
解决方案
尽管您找到了可行的解决方案;使用rowid可能会充满持续的问题。
依赖于根据rowid的顺序呈现的列表,这对于用户来说不一定是可接受的。
rowid列不能保证单调增加(尽管很有可能,除非您到达第 9223372036854775807 行)。
如果行被删除,rowid 将不会反映第 n 行,rowid将保持原样,但 VACUUM(清理)将对rowid重新编号。
如果现有的最高rowid是 9223372036854775807,那么将尝试分配一个在分配新rowid时未使用的随机值(插入新行)。
如果没有 rowid 的别名,则上述情况为真。如果存在,那么关于 VACUUM 的行为是rowid值将被保留,因此不会重新编号。
使用定义列
column_name INTEGER PRIMARY KEY
是如何使列成为rowid的别名- 如果使用了AUTOINCREMENT关键字(它只能用于作为rowid列别名的列)。然后行为再次不同,因为新的rowid必须高于曾经使用过的最高rowid(而不是现有的最高)。如果已经使用了rowid 9223372036854775807 则无法插入新行并会发出 SQLITE_FULL 错误。
通常,当出现列表时,需要第 n 个位置,例如
Alan
Mary
Bert
Sue
Fred
Jane
Zac
Louise
然后 Fred 是列表中的第 5 个或数组的偏移量 4 处的元素,因此如果数据按上述顺序插入,则rowid 5 将是 Fred 。
但是,如果列表按名称排序,那么它将显示为:-
Alan
Bert
Fred
Jane
Louise
Mary
Sue
Zac
如果从rowid的角度考虑,列表将是
1 (Alan)
3 (Bert)
5 (Fred)
6 (Jane)
8 (Louise)
2 (Mary)
4 (Sue)
7 (Zac)
所以现在 Fred 排名第三,但使用WHERE rowid = 3
会选择 Bert 而不是 Fred。
删除除最后一行以外的任何行(无排序)会在方程式之间引入差异rowid = number in list
。
rowid的预期用途是标识特定行而不是预期值。In all the above scenarios the complications can be eliminated by presenting the list but to have a parallel array of the rowid , so when selecting Fred as offset 4 then, offset 4 into the parallel array yields a value of 5.
推荐阅读
- javascript - 为什么这个未赋值的 let 变量不会导致引用错误?
- php - 我应该在我的图像表中存储评论/喜欢/不喜欢的数量吗?
- css - 带有内嵌文本的加载器的 Vuetify 按钮
- python - 将数据从表单中的条件/链式下拉框传递到视图或直接传递到 URL
- javascript - 在 2 个 react-router-v4 项目之间导航
- git - Git警告:无法访问'/home/user/.gitconfig':是一个目录
- javascript - 无法使用引导程序修复侧 div
- c# - C# 服务在安装时创建注册表
- python - pygame - 获取文本的当前颜色(pygame.Surface 类型)
- rust - How to I explicitly assign a type to an `Option
` that is used in a `match`?