Простая таблица SQL Lite / вопрос об импорте - PullRequest
8 голосов
/ 16 июля 2010

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

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

Когда я пытаюсь импортировать простой CSV-файл с двумя столбцами (prideID и pubmedID), я получаю сообщение об ошибке «ожидается 3 столбца данных, но найдено 2». Я хочу, чтобы ключ t1 был целым числом и автоматически подсчитывался при добавлении новых полей. Нужно ли ставить NOT NULL перед PRIMARY KEY, чтобы это работало?

Ответы [ 3 ]

19 голосов
/ 16 июля 2010

.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, который всегда является уникальным возрастающим числом.

1 голос
/ 31 мая 2014

Вместо insert используйте

create table newtable as select  * from  footmp;

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

0 голосов
/ 18 июля 2013

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

...