【问题标题】:How to select table rows in the reverse order of insertion in SQLite?如何在 SQLite 中以插入的相反顺序选择表行?
【发布时间】:2018-11-30 11:18:02
【问题描述】:

您好,我想以与插入相反的顺序从表中检索行。

我知道我们可以使用整数主键并使用它进行排序,但因为我在 android 应用程序中使用它。很难更改现有用户的表结构。 (是的,我忘记在旧版本中提供整数主键)

查了很多,发现Sqlite中有一个秘密列,叫ROWID,我们可以用它来排序。

SELECT * FROM tablename ORDER BY rowid DESC

但即使在使用它之后,我也得到了洗牌的结果。

任何可能的解决方案或想法?

【问题讨论】:

  • @laalto 我的意思是相反的顺序
  • 那么您的插入效果如何?你能发布一些这样的“洗牌结果”的例子吗?
  • @laalto 当我再次检查表结构时,我发现有另一列用作整数主键,但我无法使用该列值排序。所以看起来如果我们在表中已经有一个整数主键,那么我们就不能用 rowid 对其进行排序。当我从该列中删除主键时,我能够使用 rowid 对其进行完美排序。
  • 猜测您将值分配给定义为整数主键的列,因此这成为排序顺序。即 INTEGER PRIMARY KEY 实际上是 rowid 的别名。如果您随后设置值(只要它们是整数且唯一的),那么您将值分配给 rowid(您可以这样做)。

标签: java android sql sqlite


【解决方案1】:

没有任何保证,除非您专门为此目的添加了一个列。然而,rowid 很可能是正确的顺序,因此

`SELECT * FROM tablename ORDER BY rowid DESC`

将导致行处于/接近相反的顺序。

确定要使用的 rowid 的算法基本上是找到当前使用的最高 rowid 并加 1。但是,如果 rowid > 已经达到 9223372036854775807(rowid 可以是的最高数字),​​然后 SQLite 将尝试查找未使用的数字并使用它。因此不能保证。

  • 注意,如果已经使用了 AUTOINCREMENT 关键字,那么如果 rowid(PRIMARY KEY 列是 rowid 列的别名)已达到 9223372036854775807,则不能再增加行添加。尝试这样做会导致 SQLITE FULL 错误。

考虑到您的评论已经将一列定义为 INTEGER PRIMARY KEY,那么如果您更改该列中的值,那么这是 rowid 的别名,那么 rowid将被改变。这似乎是您正在经历的。

考虑以下几点:-

DROP TABLE IF EXISTS testtable;
CREATE TABLE IF NOT EXISTS testtable (mycolumn TEXT, nmbr INTEGER, nottherowid INTEGER PRIMARY KEY);
WITH RECURSIVE crtdata(tags,rnd) AS (
    SELECT 1, random()  UNION ALL SELECT tags+1, random() FROM crtdata LIMIT 30) -- creates 30 rows for insertion
    
    
INSERT INTO testtable (mycolumn, nmbr) SELECT * FROM crtdata; -- <<<< Load the table 

SELECT rowid AS the_rowid,* FROM testtable ORDER BY rowid ASC; -- <<<< sort in insertion order (very likely)

UPDATE testtable SET nottherowid = nottherowid + 10000 WHERE (nottherowid % 4) = 0; -- change every 4th row so alias of rowid is + 10000
UPDATE testtable SET rowid = rowid + 5000 WHERE (rowid % 5) = 0; -- <<<< change every 5th row so rowid is + 5000 

SELECT rowid AS the_rowid,* FROM testtable ORDER BY rowid ASC; -- <<<< ooops now not in insertion order

那么第一个结果将按照插入顺序排列:-

但第二个结果不会,根据:-

  • 注意 mycolumn 反映了原始的 rowid/INTEGER PRIMARY KEY 列(又名 nottherowid 列)

【讨论】:

  • 你是说算法吗?
  • @SubaruTashiro 我做了,已应用更改并感谢您发现它。
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多