首页 > 解决方案 > 如何在 SQLite 中以插入的相反顺序选择表行?

问题描述

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

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

经过大量搜索,我发现 Sqlite 中有一个名为 ROWID 的秘密列,我们可以使用它进行排序。

SELECT * FROM tablename ORDER BY rowid DESC

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

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

标签: javaandroidsqlsqlite

解决方案


除非您为此目的专门添加一列,否则无法保证。然而, 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列)

推荐阅读