2012-09-02 67 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。 –