2013-04-13 2 views
12

Ich versuche, eine Tabelle in SQLite, die Daten aus einer CSV-Datei und fügt einen autoinkrementierenden Primärschlüssel der ersten Spalte. Hier ist die Tabelle Ich versuche, Daten in einzufügen:Importieren Sie CSV in SQLite mit autoinkrementierenden Primärschlüssel

DROP TABLE IF EXISTS Allegiance; 
CREATE TABLE Allegiance (
    AllegianceID INTEGER PRIMARY KEY AUTOINCREMENT, 
    CharacterID INTEGER, 
    Title TEXT, 
    FOREIGN KEY (CharacterID) REFERENCES Characters(CharacterID)); 

Hier werden die Daten in der CSV-Datei

, 3, King of the North 
, 14, King of the Andals and the First Men 
, 15, Lord of Dragonstone 
, 26, Khaleesi 
, 35, Lord Reaper of Pyke 

Dies ist der Fehler, den ich empfangen:

sqlite> .mode csv 
sqlite> import allegiances.csv Allegiance; 
Error: datatype mismatch 

Ich erhalte den gleichen Fehler, wenn ich "Null" vor dem ersten Komma in jeder Zeile habe. Wenn ich vor dem ersten Komma in jeder Zeile Zufallszahlen hinzufüge, bekomme ich keine Fehler. Der tatsächliche Datensatz, mit dem ich arbeiten muss, kann jedoch viel größer sein und daher kann ich nicht einfach manuell einen eindeutigen Primärschlüssel für jeden Eintrag hinzufügen. Ich würde wirklich einige Hilfe mit dieser

+1

Wenn Sie Programme von Drittanbietern verwenden, haben Sie die Möglichkeit können Sie den Text, den NULL-Wert repräsentieren zu setzen in Ihrem CSV-Datei. SQLiteStudio ist eines dieser Programme. – Vassilis

+0

@VassilisGr Was meinen Sie mit dem Text, der den NULL-Wert darstellt? – pouya

+0

@pouya, wenn Sie eine CSV-Datei haben, die eine Zeile wie 'pouya, 26, NULL' hat, können Sie festlegen, dass der NULL-Wert in Ihrer CSV-Datei durch die Zeichenfolge" NULL "dargestellt wird. Im Falle von 'pouya, 26,, 'würden Sie NULL setzen ist" "(leere Zeichenfolge). Oder 'pouya, 26, 0' ist der NULL" 0 "in der CSV-Datei! – Vassilis

Antwort

16

zu schätzen wissen Ein leeres Feld in einer CSV-Datei ist nur eine leere Zeichenfolge, die nicht für eine INTEGER PRIMARY KEY Spalte gültig ist.

Import in eine temporäre Tabelle ohne diese Spalte, dann kopieren Sie die Daten über mit:

INSERT INTO Allegiance(CharacterID, Title) SELECT * FROM TempTable; 
+0

Ich habe einen Fehler mit dieser Lösung, ich musste ein Nullfeld in der SELECT-Liste hinzufügen INSERT INTO Allegiance (CharacterID, Titel) SELECT NULL, Title FROM TempTable; –