2013-04-13 13 views
12

Próbuję utworzyć tabelę w sqlite, która pobiera dane z pliku csv i dodaje automatycznie klucz główny do pierwszej kolumny. Oto tabela Próbuję wstawić dane do:Importowanie CSV do sqlite z autodestrukcyjnym kluczem podstawowym

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

Oto dane w pliku csv

, 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 

Jest to błąd I odbieranie:

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

Ten sam błąd pojawia się, jeśli mam "zerowy" przed pierwszym przecinkiem w każdym wierszu. Kiedy dodaję liczby losowe przed pierwszym przecinkiem w każdym wierszu, nie otrzymuję żadnych błędów. Jednak rzeczywisty zestaw danych, z którym muszę pracować, może być znacznie większy i dlatego nie mogę po prostu ręcznie dodać unikalnego klucza podstawowego dla każdego wpisu. Naprawdę doceniam pomoc z tym

+1

Jeśli używasz programów osób trzecich, może masz możliwość ustalenia tekstu, który reprezentuje wartość NULL w twojej plik csv. SQLiteStudio to jeden z tych programów. – Vassilis

+0

@VassilisGr Co masz na myśli przez tekst, który reprezentuje wartość NULL? – pouya

+0

@pouya, jeśli masz plik csv, że wiersz jest jak 'pouya, 26, NULL', możesz ustawić, że wartość NULL w pliku csv jest reprezentowana przez ciąg" NULL ". W przypadku 'pouya, 26,,' ustawiasz NULL jest "" (pusty ciąg). Lub 'pouya, 26, 0' NULL jest" 0 "w pliku csv! – Vassilis

Odpowiedz

16

Puste pole w pliku CSV to pusty ciąg, który nie jest poprawny dla kolumny INTEGER PRIMARY KEY.

importu do tabeli tymczasowej bez tej kolumny, a następnie skopiować dane za sobą:

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

Mam błąd z tym rozwiązaniem, musiałem dodać puste pole na liście SELECT INSERT INTO Allegiance (CharacterID, Title) SELECT NULL, Title From TempTable; –

Powiązane problemy