如何在SQLite中以相反的插入顺序选择表行?

时间:2018-06-21 07:52:27

标签: java android sql sqlite

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

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

经过大量搜索后,我发现Sqlite中有一个秘密列称为ROWID,我们可以将其用于排序。

SELECT * FROM tablename ORDER BY rowid DESC

但是即使使用了它,我也得到了改组的结果。

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

1 个答案:

答案 0 :(得分:1)

不能保证,除非您为此目的专门添加一列。但是 rowid 很可能顺序正确,因此

`SELECT * FROM tablename ORDER BY rowid DESC`

将导致行以/或接近相反的顺序。

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

考虑到您的注释中已经有一个已定义为INTEGER PRIMARY KEY的列,那么如果您更改了该列中的值,则这是 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

然后,第一个结果将按照插入顺序:-

enter image description here

但是,按照第二个结果将不是:-

enter image description here

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