2016-04-20 4 views
0

Ich habe eine Tabelle in einer SQLite-Datenbank, die leer ist und die erste Spalte der Tabelle ist Autoincrement Primärschlüssel. Ich würde gerne eine CSV-Datei importieren, die keine ID hat: Es hat so viele Spalten wie die Tabelle, aber eine (ID). Wie kann ich die Werte in der CSV-Datei in die entsprechenden Spalten der Tabelle importieren?sqlite: Wie importiert man eine CSV-Datei in eine Tabelle, wenn die Anzahl der Spalten nicht gleich ist?

Hier ist ein Beispiel mimimal (Windows 7, DOS):

REM -- Create csv-file 
type NUL > data.csv 
echo 'a1','b1' >> data.csv 
echo 'a2','b2' >> data.csv 
type data.csv 
'a1','b1' 
'a2','b2' 

REM -- create database and tables 
sqlite3 test.db "SELECT 1;" 
sqlite3 test.db "CREATE TABLE tab0 (va TEXT, vb TEXT);" 
REM this table has 3 columns: 
sqlite3 test.db "CREATE TABLE tab1 (id INTEGER NOT NULL PRIMARY KEY, va TEXT, vb TEXT);" 

REM -- Import csv file where number of columns are equal 
sqlite3 -separator "," test.db ".import 'data.csv' tab0" 
sqlite3 test.db 
sqlite> select * from tab0; 
'a1'|'b1' 
'a2'|'b2' 

REM -- Import csv file where number of columns are NOT equal 
sqlite3 -separator "," test.db ".import 'data.csv' tab1" 
data.csv:1: expected 3 columns bit found - filling the rest with NULL 
data.csv:1: INSERT failes: datatype mismatch 
data.csv:2: expected 3 columns bit found - filling the rest with NULL 
data.csv:2: INSERT failes: datatype mismatch 

Jede Hilfe sehr geschätzt.

Update: Gibt es eine Möglichkeit, eine temporäre Tabelle zu vermeiden?

Antwort

1

Verwenden Sie Tab0 als temporäre Tabelle, aus der Sie in Tab1 einfügen sollten.

INSERT INTO tab1(va, vb) SELECT * FROM tab0; 

Schauen Sie sich diese Antwort https://stackoverflow.com/a/15998236/2591314

+0

Danke. Derzeit verwende ich diese Problemumgehung. Ich bin gespannt, ob es möglich ist, diese temporäre Tabelle zu vermeiden. – giordano

1

Sie die tab0 tab1 füllen nutzen könnten.

so etwas wie

INSERT INTO tab1(va,vb) 
SELECT va, vb 
FROM tab0 

funktionieren sollte.

+0

Es funktioniert. Vielen Dank. Meine Problemumgehung verwendet eine temporäre Tabelle, aber ich wollte wissen, ob es eine Möglichkeit gibt, dies zu vermeiden. – giordano

1

Sie können das Autoinkrement-Feld an das Ende der Tabelle verschieben, wo der fehlende Wert beim Import durch null ersetzt und durch den Autoinkrement-Wert ersetzt wird ("NOT NULL" ist impliziert, Sie brauchen es also nicht) :

CREATE TABLE tab1 (va TEXT, vb TEXT, id INTEGER PRIMARY KEY) 
+0

Danke, ich habe etwas Neues gelernt. Aber offensichtlich gibt es keine Möglichkeit, die Spalten so zu steuern, dass der Primärschlüssel in der ersten Spalte bleibt. – giordano

+0

Was meinst du? Sie können die Tabelle in der Datenbank nicht erstellen oder ändern. – mthierer

+0

In diesem Fall könnte ich Tabelle ändern, aber ich wollte wissen, ob es einen Weg gab, wenn die Struktur der Tabelle gegeben ist und die Reihenfolge der Spalten in der CSV-Datei nicht der Tabelle entspricht. – giordano

Verwandte Themen