简单的SQL Lite表/导入问题

问题描述:

我有一个简单的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才能使其工作?

.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的别名 - 它始终是一个唯一的升序编号。

随着sqlite的版本(SQLite 3.7.15.2 2013-01-09)我开着,你不必先导入临时表。我所做的只是确保在开始导入之前设置分隔符。我没有指定每行的ID值,所以,我在CSV第一列是一组独特的整数

代替insert使用

create table newtable as select * from footmp; 

这是更好,更快的。