2012-09-02 65 views
7

我正在向SQLite3中的表添加'索引'列,以允许用户轻松地重新排序数据,方法是重命名旧数据库并在其位置创建一个具有额外列的新数据库。用于Oracle ROWNUM的SQLITE等价物?

我遇到的问题是,我需要给每一行'索引'列中的唯一编号时,我插入...选择旧的值。

我在Oracle中搜索过一个名为ROWNUM的有用术语,但SQLite3没有。在SQLite中有什么等价的东西吗?

回答

10

您可以使用其中一个特殊行名称ROWID,OID_ROWID_以获得列的rowid。有关更多详细信息,请参阅http://www.sqlite.org/lang_createtable.html#rowid(并且可以通过名为ROWID等的普通列隐藏行)。

+0

SELECT rowid FROM 应该为您返回每个记录的唯一行号。这相当于ROWNUM。 –

+6

不完全。 ORACLE ROWNUM适用于查询的* result *。 '选择rownum从tbl WHERE rownum> 3'什么也找不到(因为第一行这是真的会得到rownum 1)。但这不是OP的要求。他只需要一个独特的价值。 –

+1

好吧,它可能与ROWNUM“不完全一样”,但它是每行自动添加的唯一ID。这是@ Raceimaztion的要求。 –

7

没有SQLite没有直接等价于Oracle的ROWNUM。

如果我正确理解你的要求,你应该能够添加编号列基于旧表的排序是这样的:

create table old (col1, col2); 

insert into old values 
    ('d', 3), 
    ('s', 3), 
    ('d', 1), 
    ('w', 45), 
    ('b', 5465), 
    ('w', 3), 
    ('b', 23); 

create table new (colPK INTEGER PRIMARY KEY AUTOINCREMENT, col1, col2); 

insert into new select NULL, col1, col2 from old order by col1, col2; 

新表包含:

.headers on 
.mode column 

select * from new; 

colPK  col1  col2  
---------- ---------- ---------- 
1   b   23   
2   b   5465  
3   d   1   
4   d   3   
5   s   3   
6   w   3   
7   w   45 

AUTOINCREMENT顾名思义:每个附加行都有前一个'值递增1.

+0

当然有一个等价的,使用rowid。 –