2012-09-02 16 views
7

Aggiungo una colonna "indice" a una tabella in SQLite3 per consentire agli utenti di riordinare facilmente i dati, rinominando il vecchio database e creando uno nuovo al suo posto con le colonne aggiuntive.equivalente SQLITE per Oracle's ROWNUM?

Il problema che ho è che ho bisogno di dare ad ogni riga un numero univoco nella colonna 'indice' quando INSERIRE ... SELEZIONA i vecchi valori.

Una ricerca che ho fatto ha trovato un termine utile in Oracle chiamato ROWNUM, ma SQLite3 non ha questo. C'è qualcosa di equivalente in SQLite?

risposta

10

È possibile utilizzare uno dei nomi di riga speciali ROWID, OID o _ROWID_ per ottenere il rowid di una colonna. Vedere http://www.sqlite.org/lang_createtable.html#rowid per ulteriori dettagli (e che le righe possono essere nascoste da colonne normali denominate ROWID e così via).

+0

SELECT rowid FROM dovrebbe restituire il numero di riga univoco per ogni record. Questo è equivalente a ROWNUM. –

+6

Non esattamente. Oracles ROWNUM si applica al * risultato * della query. 'SELEZIONA rownum FROM tbl WHERE rownum> 3' non troverà nulla (perché la prima riga in cui ciò sarebbe vero ottiene il rownum 1). Ma questo non è il requisito dei PO. Ha solo bisogno di un valore unico. –

+1

Ok, potrebbe non essere "esattamente" come ROWNUM ma è l'ID univoco per ogni riga aggiunta automaticamente. Questo è il requisito di @ Raceimaztion. –

7

Nessun SQLite non ha un equivalente diretto a ROWNUM di Oracle.

Se ho capito bene il vostro requisito, si dovrebbe essere in grado di aggiungere una colonna numerata sulla base di ordinamento del vecchio tavolo in questo modo:

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; 

La nuova tabella contiene:

.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 

Il AUTOINCREMENT fa quello che suggerisce il nome: ogni riga aggiuntiva ha il valore 'precedente incrementato di 1.

+0

Ovviamente c'è un equivalente, usa il rowid. –