2010-07-15 32 views
8

Tôi có một câu hỏi SQL đơn giản. Tôi muốn thực hiện một cơ sở dữ liệu 3 cột và tôi có đoạn mã sau:Bảng SQL Lite đơn giản/câu hỏi nhập

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

Khi tôi cố gắng nhập một tập tin csv đơn giản với hai cột (prideID và pubmedID), tôi nhận được một "dự kiến ​​3 cột dữ liệu nhưng tìm thấy lỗi 2 ". Tôi muốn t1key là một số nguyên và tự động đếm khi các trường mới được thêm vào. Tôi có phải đặt NOT NULL trước PRIMARY KEY để làm việc này không?

Trả lời

17

.import không hỗ trợ định lại lại đầu vào (ngoại trừ việc đặt dấu phân tách). Bạn cần nhập tệp CSV vào bảng tạm thời và chèn tệp đó vào bảng thực. Đây là phiên ví dụ:

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

Bạn thấy ID đó được tính. Điều này là do một cột có loại INTEGER PRIMARY KEY được coi là bí danh cho ROWID nội bộ - luôn luôn là một số tăng dần duy nhất.

0

Với .version của sqlite (SQLite 3.7.15.2 2013-01-09) Tôi đang bật, bạn không phải nhập vào bảng tạm thời trước. Tất cả những gì tôi làm là đảm bảo rằng tôi đã đặt dấu phân cách trước khi bắt đầu nhập. Tôi đã xác định các giá trị id cho mỗi hàng, vì vậy, cột đầu tiên của tôi trong csv là một tập hợp các số nguyên độc đáo

1

Thay vì sử dụng insert

create table newtable as select * from footmp; 

Nó là tốt hơn và nhanh hơn.