java - 如何在 SQLite 中以插入的相反顺序选择表行?
问题描述
嗨,我想以插入的相反顺序从表中检索行。
我知道我们可以使用整数主键并对其进行排序,但是因为我在 android 应用程序中使用它。很难更改现有用户的表结构。(是的,我忘记在旧版本中提供整数主键)
经过大量搜索,我发现 Sqlite 中有一个名为 ROWID 的秘密列,我们可以使用它进行排序。
SELECT * FROM tablename ORDER BY rowid DESC
但即使在使用它之后,我也得到了洗牌的结果。
任何可能的解决方案或想法?
解决方案
除非您为此目的专门添加一列,否则无法保证。然而, 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列)
推荐阅读
- codeigniter - 来自 foreach 的回声
- android - 在 Xamarin 中使用 android.support.design.widget
- laravel - Laravel 中未定义的插槽变量
- sql - VB.net更新SQL命令
- multithreading - python同时进行两个操作 - 线程
- r - 将两个数据框列与长度为 2 的向量匹配,以获取 r 中匹配行中的值
- java - Java 8:根据某些字段过滤 2 个不同的 JSON 数组
- c# - 如何从按周、月、季度或年分组的随机日期列表中提取最大日期?
- c# - 没有HorizontalOffset的弹出窗口以所有分辨率wpf居中
- linux - 无法打印进程的PID