回答

收藏

简单的SQL Lite表/导入问题

技术问答 技术问答 300 人阅读 | 0 人回复 | 2023-09-13

我有一个简单的SQL问题。我想建立一个三列数据库,并且我有以下代码:
) y# V* D5 v6 b1 Isqlite3 meshdb.db "create table t1 (t1key INTEGER PRIMARY KEY, prideID, pubmedID);"
* X/ O) a; H# X) Y' E  L0 B4 L0 ?# W8 K) L) @6 k
当我尝试导入具有两列(prideID和pubmedID)的简单csv文件时,出现“预期3列数据,但发现2”错误。我希望t1key是一个整数,并在添加新字段时自动计数。我是否必须在主键前放置NOT NULL才能使其正常工作?0 P# o& h* b% V& H
                2 v* L+ i$ y+ l) v$ j& K+ E3 f
解决方案:
1 |6 C$ P; M: `; V: X               
3 o4 q3 m% s. ~8 }2 j# Q/ h# w1 _' k- t
  A7 \* L% w% o; c2 O1 L' A0 [
                .import不支持重塑输入(设置分隔符除外)。您需要将CSV文件导入到临时表中,然后将其插入到真实表中。这是一个示例会话:' p- w0 g  L( S; {1 v
$ cat a.csv ; y" V, u: @0 L! k
1,2) f5 F& v0 M2 J; z) {$ n; W, G
3,4$ @% m/ E( [" E  p& F2 u3 X/ s
5,61 T6 U/ p# J+ n5 T
$ sqlite3 a.db0 b$ r2 `7 x9 l9 y" G
SQLite version 3.6.23.1
0 Y: ]1 M) \9 i1 `5 |9 d* aEnter ".help" for instructions( E; x0 S- _% d  }- o4 d
Enter SQL statements terminated with a ";"
! A( I  r" j* ?sqlite> create table foo(id integer primary key,x,y);: l# {4 ^. B# K- c9 k& O
sqlite> create temp table footmp(x,y);
& }7 f5 E, S7 w$ D9 u  p( Ysqlite> .separator ,
2 Q3 R* u& X$ a3 j  Q1 o7 y2 b" hsqlite> .import a.csv footmp, z5 z4 s; u/ q0 G5 c
sqlite> select * from footmp;5 H5 b$ ?9 G" y
1,2  X7 W# z" B  D, [& R, u1 E
3,44 d* j7 z9 X2 i* G# W5 `9 `+ D
5,6- S4 v- c, w' {3 q; \- b. r% B
sqlite> insert into foo(x,y) select * from footmp; 4 c* a5 E- g6 ^' D
sqlite> select * from foo;
) U# R1 D  S2 d6 y9 I: j+ Z1,1,2
( r9 b5 U' G% o. O8 r6 Y- @2,3,4
3 j' [0 g1 s0 k+ H+ U1 `3,5,6
6 ^# ]0 I6 v4 d2 Y9 Rsqlite> drop table footmp;
$ A& L/ T- Y  \6 V& R5 U- X
0 F$ C( a4 J2 g3 b4 u* i# D您会看到ID已递增。这是因为类型为INTEGER PRIMARY KEY的列被视为内部ROWID的别名-内部ROWID始终是唯一的,升序的数字。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则