2010-07-15 27 views
8

J'ai une question SQL simple. Je veux faire une base de données 3 colonnes et je le code suivant:Table SQL Lite simple/question d'importation

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

Lorsque je tente d'importer un simple fichier csv avec deux colonnes (prideID et pubmedID), je suis un « attendu 3 colonnes de données, mais trouvé 2 "erreur. Je veux que la clé t1key soit un nombre entier et compte automatiquement au fur et à mesure que de nouveaux champs sont ajoutés. Dois-je mettre NOT NULL devant PRIMARY KEY pour que cela fonctionne?

Répondre

17

.import ne prend pas en charge le remodelage de l'entrée (à l'exception de la définition du séparateur). Vous devez importer le fichier CSV dans une table temporaire et l'insérer dans la table réelle. Voici un exemple de session:

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

Vous voyez que l'ID est comptée. Cela est dû au fait qu'une colonne de type INTEGER PRIMARY KEY est traitée comme un alias pour le ROWID interne - qui est toujours un nombre croissant unique.

0

Avec la version de sqlite (SQLite 3.7.15.2 2013-01-09) Je suis allumé, vous n'avez pas besoin d'importer dans une table temporaire en premier. Tout ce que je faisais était de m'assurer que j'ai mis un séparateur avant de commencer l'importation. Je l'ai fait préciser les valeurs id pour chaque ligne, donc, ma première colonne du csv était un ensemble d'entiers uniques

1

Au lieu de insert utilisation

create table newtable as select * from footmp; 

Il est préférable et plus rapide.