【问题标题】:Simple SQL Lite table/import question简单的 SQLite 表/导入问题
【发布时间】:2010-07-15 23:20:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql sqlite sqlite3-ruby


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      而不是insert 使用

      create table newtable as select  * from  footmp;
      

      更好更快。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-26
          • 2018-03-07
          • 1970-01-01
          相关资源
          最近更新 更多