2010-07-15 21 views
8

Tengo una pregunta simple de SQL. Quiero hacer una base de datos de 3 columnas y tengo el siguiente código:Tabla simple de SQL Lite/pregunta de importación

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

Cuando intento importar un archivo CSV simple con dos columnas (prideID y pubmedID), aparece un "esperaba 3 columnas de datos, pero encontró 2 "error. Quiero que la t1key sea un número entero, y automáticamente cuente conforme se agreguen nuevos campos. ¿Tengo que poner NOT NULL delante de PRIMARY KEY para que esto funcione?

Respuesta

17

.import no es compatible con la reconfiguración de la entrada (excepto desde la configuración del separador). Necesita importar el archivo CSV en una tabla temporal y la inserta en la tabla real. Aquí hay una sesión de ejemplo:

$ 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; 

Verá que la identificación se cuenta. Esto se debe a que una columna con el tipo INTEGER PRIMARY KEY se trata como un alias para el ROWID interno, que siempre es un número único y ascendente.

0

Con .version de sqlite (SQLite 3.7.15.2 2013-01-09) Estoy encendido, no tiene que importar primero en una tabla temporal. Todo lo que hice fue asegurarme de configurar un separador antes de comenzar la importación. Hice especificar los valores de ID para cada fila, por lo que, mi primera columna en el csv era un conjunto de números enteros únicos

1

En lugar de insert uso

create table newtable as select * from footmp; 

Es mejor y más rápido.

Cuestiones relacionadas