使用SQLite向表中添加行号的简单,计算成本低廉的方法?

时间:2016-08-23 16:48:44

标签: sqlite row-number

用Google搜索了相当多的答案,并找到了解答类似但不同问题的答案,但不是我想要做的事情。

我有一张桌子,我想为它添加一个行号。所以:

ID  || value 
91  || valueA
11  || valueB
71  || valueC

变为

Row# || ID  || value 
1    || 91  || valueA
2    || 11  || valueB
3    || 71  || valueC

发现this answer比我的用例复杂一点。此外,我被警告不要使用答案,因为它们的计算成本很高(n ^ 2-ish)。

还找到了一些其他答案,例如this one,其中用户想要为查询返回的行号,但这是一个不同的用例。我只想在表中的所有行中附加一个行号。

2 个答案:

答案 0 :(得分:2)

根据您的问题,您似乎要求在数据库中添加另一列。如果不是这样,请评论。

在数据库创建类(或创建数据库的任何位置)中,在CREATE TABLE语句中,使用以下结构:

CREATE TABLE table_name(
    RowNum INTEGER AUTOINCREMENT,
    _ID INTEGER PRIMARY KEY,
    value TEXT,
);

将数据库版本增加1,这样做会很好。

答案 1 :(得分:2)

我想你知道,在SQL表中没有固有的顺序。因此,任何“行号”都基于一些隐含的顺序。如果在DBMS中使用任何类型的“行ID”,则隐式顺序可能是插入顺序。这很便宜,如果它符合你的需要,那就是你想要的。

您创建的任何其他“行号”都需要排序;如果索引支持,那么排序将是O( N log N ),否则,是,O( N ^ 2 )。数学有一种非常坚持的方式。

在用不同的伪装多次回答这个问题之后,我写了simple example。在SQLite中,我有不到一百万行的良好经验。更大的种类需要更长时间,YMMV。

FWIW,我从不存储衍生订单。由于系统无法切实执行其正确性,因此无法确定其是否正确。最好在有趣的订单上保留一个覆盖指数,并在需要时依靠视图提供等级序数。