2010-07-15 5 views
8

Ich habe eine einfache SQL-Frage. Ich möchte eine 3-Spalten-Datenbank machen, und ich habe den folgenden Code:Einfache SQL Lite-Tabelle/Frage importieren

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

Wenn ich versuche, eine einfache CSV-Datei mit zwei Spalten (prideID und pubmedID) zu importieren, ich eine „erwartete 3 Spalten von Daten erhalten, aber 2 "Fehler gefunden. Ich möchte, dass der Schlüssel t1 eine Ganzzahl ist, und automatisch hochzählen, wenn neue Felder hinzugefügt werden. Muss ich NOT NULL vor PRIMARY KEY setzen, damit dies funktioniert?

Antwort

17

.import unterstützt keine Umformung der Eingabe (außer das Trennzeichen zu setzen). Sie müssen die CSV-Datei in eine temporäre Tabelle importieren und diese in die reale Tabelle einfügen. Hier ist eine Beispielsitzung:

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

Sie sehen, dass die ID hochgezählt wird. Dies liegt daran, dass eine Spalte mit dem Typ INTEGER PRIMARY KEY als Alias ​​für die interne ROWID behandelt wird - die immer eine eindeutige aufsteigende Zahl ist.

0

Mit der .version von sqlite (SQLite 3.7.15.2 2013-01-09) Ich bin auf, müssen Sie nicht zuerst in eine temporäre Tabelle importieren. Alles, was ich getan habe, war sicherzustellen, dass ich ein Trennzeichen gesetzt habe, bevor ich den Import starte. Ich habe den ID-Wert für jede Zeile angeben, so, meine erste Spalte in der CSV war eine Reihe von einzigartigen ganzen Zahlen

1

Statt insert Verwendung

create table newtable as select * from footmp; 

Es ist besser und schneller.