Simples SQL Lite tabela de importação/pergunta
-
16-09-2020 - |
Pergunta
Eu tenho uma simples pergunta SQL.Eu quero fazer uma coluna 3 banco de dados e eu tenho o seguinte código:
sqlite3 meshdb.db "create table t1 (t1key INTEGER PRIMARY KEY, prideID, pubmedID);"
Quando eu tentar importar um arquivo csv simples, com duas colunas (prideID e pubmedID), eu recebo um "esperado 3 colunas de dados, mas encontrou erro 2".Eu quero o t1key ser um número inteiro, e automaticamente contar como campos novos são adicionados.Tenho que colocar not NULL na frente de CHAVE PRIMÁRIA para este trabalho?
Solução
.import
não oferece suporte a reformulação de entrada (exceto desde a definição do separador).Você precisará importar o arquivo CSV para uma tabela temporária e a inserir na tabela real.Aqui está um exemplo de sessão:
$ 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;
Você verá que o ID é contado para cima.Isto é porque uma coluna com o tipo INTEGER CHAVE PRIMÁRIA é tratada como um alias para o interno ROWID, que sempre é uma única, em ordem crescente de número.
Outras dicas
Em vez de insert
utilização
create table newtable as select * from footmp;
É melhor e mais rápido.
Com .versão do sqlite (SQLite 3.7.15.2 2013-01-09) Eu tenho, você não tem que importar em uma tabela temporária em primeiro lugar.Tudo que eu fiz foi para certificar-se de definir um separador antes de iniciar a importação.Eu fiz especificar os valores de id para cada linha, então, minha primeira coluna no arquivo csv foi um conjunto único de números inteiros