数据库中的定位行

时间:2019-02-15 17:51:39

标签: sqlite

我无法定位数据库中的特定行

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

  select * from Contacts WHERE RowNum = 5

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

编辑:现在已修复,正确的代码是:

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

1 个答案:

答案 0 :(得分:0)

尽管您找到了可行的解决方案;使用 rowid 可能会遇到持续的问题。

  • 依赖于根据 rowid 的顺序显示的列表,这不一定是用户可以接受的。

  • 不能保证 rowid 列会单调增加(尽管很有可能,除非您到达9223372036854775807第一行)。

  • 如果删除行,将不反映第n行,将保持原样,但是VACUUM(清理)将重新编号< strong> rowid 。

  • 如果现有的最高 rowid 是9223372036854775807,则将尝试分配一个随机值,该值在分配了新的 rowid (新插入行)。

如果没有rowid的别名,则以上内容为true。如果存在有关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)

因此,弗雷德现在排名第三,但是使用WHERE rowid = 3会选择伯特而不是弗雷德。

删除除最后一行以外的任何一行(无顺序)会导致方程rowid = number in list之间的差异。

的预期用途是标识特定行,而不是预期值。在上述所有情况下,都可以通过显示列表但具有 rowid 的并行数组来消除复杂性,因此,当选择Fred作为偏移量4时,将偏移量4放入并行数组中将得到一个值5。