2013-04-13 12 views
12

Bir csv dosyasından veri alan ve ilk sütuna otomatik bir birincil anahtar ekleyen bir sqlite tablo oluşturmaya çalışıyorum. İşteAutoincrementing birincil anahtar ile sqlite içine csv alma

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

ben alma hatası .csv dosyasına

, 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 

Bu veriler edilir:

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

İşte veri eklemek çalışıyorum tablodur Her satırdaki ilk virgülden önce "boş" varsa aynı hatayı alıyorum. Her satırdaki ilk virgülden önce rasgele sayılar eklediğimde, herhangi bir hata almıyorum. Bununla birlikte, üzerinde çalışmam gereken gerçek veri kümesi çok daha büyük olabilir ve bu nedenle, her giriş için benzersiz bir birincil anahtara elle ekleyemiyorum. Bu

+1

üçüncü taraf programları kullanıyorsanız, sen BOŞ değeri temsil metni belirleme olanağına sahip olabilirler sizin csv dosyası. SQLiteStudio bu programlardan biridir. – Vassilis

+0

@VassilisGr NULL değerini temsil eden metinle ne demek istiyorsun? – pouya

+0

@pouya, csv dosyasının bir satırında "pouya, 26, NULL" gibi varsa, csv dosyanızdaki NULL değerinin "NULL" dizesiyle temsil edileceğini ayarlayabilirsiniz. Pouya, 26, 'durumunda, NULL 'u" "(boş dizge) olarak ayarlarsınız. Veya 'pouya, 26, 0' NULL, csv dosyasında" 0 "dır! – Vassilis

cevap

16

ile ilgili yardımlardan dolayı minnettarım. CSV dosyasındaki boş alan sadece INTEGER PRIMARY KEY sütun için geçerli olmayan boş bir dizidir. o sütun olmadan geçici bir tabloya

İthalat, daha sonra üzerinden veri kopyalama:

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

Bu çözümle ilgili bir hatam var, SELECT listesinde INSERT INTO Alegiance (Karakter Kimliği, Başlık) SELECT NULL, TempTable FROM adında boş bir alan eklemek zorunda kaldım; –