首页 > 解决方案 > 数据库中的目标行

问题描述

我在定位数据库中的特定行时遇到问题

我希望能够从表联系人中选择 WHERE rownumber = 5(例如)

  select * from Contacts WHERE RowNum = 5

这不起作用,但是它应该选择行号为 5 的数据。

编辑:这现在是固定的,正确的代码是:

("select rowid, * from Contacts WHERE rowid = $num+1")

标签: sqlite

解决方案


尽管您找到了可行的解决方案;使用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.


推荐阅读