8

我有一个简单的 SQL 问题。我想制作一个 3 列数据库,我有以下代码:

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

当我尝试导入包含两列(prideID 和 pubmedID)的简单 csv 文件时,出现“预期 3 列数据,但发现 2”错误。我希望 t1key 是一个整数,并在添加新字段时自动计数。我是否必须将 NOT NULL 放在 PRIMARY KEY 前面才能使其正常工作?

4

3 回答 3

20

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

于 2010-07-15T23:48:00.460 回答
1

而不是insert使用

create table newtable as select  * from  footmp;

它更好更快。

于 2014-05-31T18:27:44.147 回答
0

使用 sqlite 的 .version (SQLite 3.7.15.2 2013-01-09),您不必先导入临时表。我所做的只是确保在开始导入之前设置了一个分隔符。我确实为每一行指定了 id 值,所以,我在 csv 中的第一列是一组唯一整数

于 2013-07-18T01:44:35.447 回答