gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:05:53 29 4
gpt4 key购买 nike

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

我知道我们可以使用整数主键并用它进行排序,但因为我在 Android 应用程序中使用它。对于已经存在的用户来说,改变表结构是很困难的。 (是的,我忘记在旧版本中给出整数主键)

经过一番搜索,我发现Sqlite中有一个 secret 列,称为ROWID,我们可以用它来排序。

SELECT * FROM tablename ORDER BY rowid DESC

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

有什么可能的解决方案或想法吗?

最佳答案

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

`SELECT * FROM tablename ORDER BY rowid DESC`

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

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

  • 注意,如果使用了 AUTOINCRMENT 关键字,那么如果 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

然后第一个结果将按插入顺序排列,如下所示:-

enter image description here

但是第二个结果不会是这样:-

enter image description here

  • 请注意,mycolumn 反射(reflect)了原始 rowid/INTEGER PRIMARY KEY 列(又名 nottherowid 列)

关于java - 如何在 SQLite 中以与插入相反的顺序选择表行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50963191/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com