SQLite:订购我的选择结果

时间:2012-01-27 02:52:37

标签: sqlite

我有一个包含唯一用户名的表和一堆我正在跟踪的字符串数据。每个用户将有1000行,当我选择它们时,我想按照添加的顺序返回它们。以下代码是否是必要且正确的方法:

CREATE TABLE foo (
  username TEXT PRIMARY KEY,
  col1 TEXT,
  col2 TEXT,
  ...
  order_id INTEGER NOT NULL
);

CREATE INDEX foo_order_index ON foo(order_id);

SELECT * FROM foo where username = 'bar' ORDER BY order_id;

3 个答案:

答案 0 :(得分:2)

添加DateAdded字段,并将其默认为添加行的日期/时间并对其进行排序。

如果你绝对必须使用order_ID,我不建议。然后至少使它成为一个标识列。我建议不要这样做是因为你依靠副作用进行排序,这会使你的代码更难阅读。

答案 1 :(得分:1)

如果每个用户都有1000行,那么username不应该是主键。一种选择是使用所有表都具有的int identity列(它优化了I / O读取,因为它通常以该顺序存储)。

在“RowIds和整数主键”@ http://www.sqlite.org/lang_createtable.html

下阅读
  

SQLite中每个表的数据都存储为B树结构   包含每个表行的条目,使用rowid值作为   键。这意味着通过rowid检索或排序记录很快。

因为它在B树结构中以该顺序存储,所以int主键应该快速排序。 确保它是rowid的别名 - 在该文章中更多。

另外,如果您要进行username ='bob'的查询,您应该考虑用户名列上的索引 - 特别是会有很多用户因为选择性高而使索引生效。相反,在列上添加索引(例如1和0)只会导致选择性降低并使索引失效。所以,如果你有3个用户:)这是不值得的。

答案 2 :(得分:0)

您可以删除order_id列&完全索引(除非你需要它们以外的其他东西)。

SQLite表始终具有整数主键 - 在这种情况下,您的用户名列默认为唯一键,因此该表只有一个整数主键。键列称为rowid。为了您的排序目的,您需要明确地将其设为AUTOINCREMENT,以便每行总是具有比旧行更高的rowid。

您可能想阅读http://www.sqlite.org/autoinc.html

CREATE TABLE foo (
   rowid INTEGER PRIMARY KEY AUTOINCREMENT,
   username TEXT UNIQUE KEY,
   ...

然后你的选择变为

 select * from foo order by rowed;

这种方法的一个优点是你重新使用索引SQLite已经放在你的桌子上。 date或order_id列将意味着一个额外的索引,这只是开销。