2010-07-15 3 views
8

У меня есть простой вопрос SQL. Я хочу, чтобы сделать базу данных в 3 столбца и у меня есть следующий код:Simple SQL Lite table/import question

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

Когда я пытаюсь импортировать простой файл CSV с двумя столбцами (prideID и pubmedID), я получаю «ожидается 3 столбцов данных, но найдена ошибка 2 ". Я хочу, чтобы t1key был целым числом и автоматически подсчитывал, когда добавляются новые поля. Должен ли я поставить NOT NULL перед ПЕРВЫМ КЛЮЧОМ, чтобы это работало?

ответ

17

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

Вы видите, что идентификатор подсчитан. Это связано с тем, что столбец с типом INTEGER PRIMARY KEY рассматривается как псевдоним для внутреннего ROWID - который всегда является уникальным, восходящим числом.

0

С .version sqlite (SQLite 3.7.15.2 2013-01-09) Я нахожусь, вам не нужно сначала импортировать в временную таблицу. Все, что я сделал, это убедиться, что я установил разделитель перед началом импорта. Я сделал указать значение идентификатора для каждой строки, поэтому, мой первый столбец в CSV-файле был набором уникальных целых чисел

1

Вместо insert использования

create table newtable as select * from footmp; 

лучше и быстрее.