2010-07-15 16 views
8

Ho una semplice domanda SQL. Voglio fare un database 3 colonna e ho il seguente codice:Semplice tabella SQL Lite/domanda di importazione

sqlite3 meshdb.db "create table t1 (t1key INTEGER PRIMARY KEY, prideID, pubmedID);" 

Quando si tenta di importare un file CSV semplice con due colonne (prideID e pubmedID), ho un "aspettavo 3 colonne di dati, ma trovato 2 "errore. Voglio che il tasto t1 sia un numero intero e conteggio automatico quando vengono aggiunti nuovi campi. Devo mettere NOT NULL davanti al PRIMARY KEY per farlo funzionare?

risposta

17

.import non supporta la riformulazione dell'ingresso (tranne che dall'impostazione del separatore). Devi importare il file CSV in una tabella temporanea e inserirlo nella tabella reale. Ecco una sessione di esempio:

$ cat a.csv 
1,2 
3,4 
5,6 
$ sqlite3 a.db 
SQLite version 3.6.23.1 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> create table foo(id integer primary key,x,y); 
sqlite> create temp table footmp(x,y); 
sqlite> .separator , 
sqlite> .import a.csv footmp 
sqlite> select * from footmp; 
1,2 
3,4 
5,6 
sqlite> insert into foo(x,y) select * from footmp; 
sqlite> select * from foo; 
1,1,2 
2,3,4 
3,5,6 
sqlite> drop table footmp; 

Si vede che l'ID è contato. Questo perché una colonna con tipo INTEGER PRIMARY KEY viene considerata come un alias per il ROWID interno, che è sempre un numero ascendente unico.

0

Con .version of sqlite (SQLite 3.7.15.2 2013-01-09) Sono attivo, non è necessario importare prima in una tabella temporanea. Tutto quello che ho fatto è stato assicurarmi di impostare un separatore prima di iniziare l'importazione. Ho fatto di specificare i valori ID per ogni riga, quindi, la mia prima colonna del CSV è stato un insieme di interi unici

1

Invece di insert uso

create table newtable as select * from footmp; 

E 'meglio e più rapidamente.

Problemi correlati