2010-07-15 38 views
8

我有一個簡單的SQL問題。我想打一個3列的數據庫,我有以下代碼:簡單的SQL Lite表/導入問題

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

當我嘗試導入一個簡單的CSV文件有兩列(prideID和pubmedID),我得到一個「預期的數據的3列,但發現2「錯誤。我希望t1key是一個整數,並且在添加新字段時自動計數。我是否必須在PRIMARY KEY之前放置NOT NULL才能使其工作?

回答

17

.import不支持對輸入進行整形(設置分隔符除外)。您需要將CSV文件導入臨時表並將其插入真正的表中。以下是一個示例會話:

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

您會看到該ID已經過計數。這是因爲一個類型爲INTEGER PRIMARY KEY的列被視爲內部ROWID的別名 - 它始終是一個唯一的升序編號。

0

隨着sqlite的版本(SQLite 3.7.15.2 2013-01-09)我開着,你不必先導入臨時表。我所做的只是確保在開始導入之前設置分隔符。我沒有指定每行的ID值,所以,我在CSV第一列是一組獨特的整數

1

代替insert使用

create table newtable as select * from footmp; 

這是更好,更快的。