Question

J'ai une simple question SQL.Je souhaite créer une base de données à 3 colonnes et j'ai le code suivant :

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

Lorsque j'essaie d'importer un simple fichier CSV avec deux colonnes (prideID et pubmedID), j'obtiens une erreur « 3 colonnes de données attendues mais 2 trouvées ».Je veux que la clé t1 soit un nombre entier et qu'elle compte automatiquement à mesure que de nouveaux champs sont ajoutés.Dois-je mettre NOT NULL devant PRIMARY KEY pour que cela fonctionne ?

Était-ce utile?

La solution

.import ne prend pas en charge la refonte de l'entrée (sauf pour la définition du séparateur).Vous devez importer le fichier CSV dans une table temporaire et l'insérer dans la table réelle.Voici un exemple de séance :

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

Vous voyez que l'identification est comptée.En effet, une colonne de type INTEGER PRIMARY KEY est traitée comme un alias pour le ROWID interne – qui est toujours un nombre unique croissant.

Autres conseils

au lieu de insert UTILISATION

create table newtable as select  * from  footmp;

C'est mieux et plus rapide.

avec le .version de SQLite ( SQLite 3.7.15.2 2013-01-09 ) Je suis activé, vous n'avez pas à importer en une table Temp d'abord.Tout ce que j'ai fait était de m'assurer que je fixe un séparateur avant de commencer l'importation.J'ai spécifié les valeurs d'identification pour chaque ligne, donc ma première colonne de la CSV était un ensemble d'entiers uniques

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top