Dans MySQL, vous pouvez insérer plusieurs lignes comme ceci:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
Cependant, je reçois une erreur lorsque j'essaie de faire quelque chose comme ça. Est-il possible d'insérer plusieurs lignes à la fois dans une base de données SQLite? Quelle est la syntaxe pour faire ça?
Réponses:
mise à jour
Comme le souligne BrianCampbell ici , SQLite 3.7.11 et supérieur prend désormais en charge la syntaxe plus simple de la publication d'origine . Cependant, l'approche présentée est toujours appropriée si vous souhaitez une compatibilité maximale entre les bases de données héritées.
réponse originale
Si j'avais des privilèges, je répondrais à la réponse de River : vous pouvez insérer plusieurs lignes dans SQLite, vous avez juste besoin d' une syntaxe différente . Pour être parfaitement clair, l'exemple OPs MySQL:
Cela peut être refondu dans SQLite comme:
une note sur la performance
À l'origine, j'ai utilisé cette technique pour charger efficacement de grands ensembles de données à partir de Ruby on Rails. Cependant , comme le souligne Jaime Cook , il n'est pas clair qu'il s'agit d'un individu plus rapide
INSERTs
dans une seule transaction:Si l'efficacité est votre objectif, essayez-le d'abord.
une note sur UNION vs UNION ALL
Comme plusieurs personnes l'ont commenté, si vous utilisez
UNION ALL
(comme indiqué ci-dessus), toutes les lignes seront insérées, donc dans ce cas, vous obtiendrez quatre lignes dedata1, data2
. Si vous omettez laALL
, les lignes en double seront éliminées (et l'opération sera probablement un peu plus lente). Nous utilisons UNION ALL car il correspond plus étroitement à la sémantique du message d'origine.en terminant
PS: Veuillez attribuer +1 à la réponse de river , car elle a présenté la solution en premier.
la source
insert into t values (data),(data),(data)
oubegin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;
?UNION ALL
pour éviter cela (ou pour certains gains de performance mineurs).sqlite3.sqlite_version
(ce devrait être 3.7.x ou 3.8.x), passqlite3.version
(qui est juste la version du module python).Oui, c'est possible, mais pas avec les valeurs d'insertion habituelles séparées par des virgules.
Essaye ça...
Oui, c'est un peu moche mais assez facile pour automatiser la génération de l'instruction à partir d'un ensemble de valeurs. En outre, il semble que vous ayez seulement besoin de déclarer les noms de colonne lors de la première sélection.
la source
UNION ALL
ne pas utiliserUNION
. Sauf si vous souhaitez supprimer les doublons.Oui, depuis SQLite 3.7.11, cela est pris en charge dans SQLite. De la documentation SQLite :
(lorsque cette réponse a été écrite à l'origine, cela n'était pas pris en charge)
Pour la compatibilité avec les anciennes versions de SQLite, vous pouvez utiliser l'astuce suggérée par andy et fearless_fool using
UNION
, mais pour 3.7.11 et versions ultérieures, la syntaxe plus simple décrite ici devrait être préférée.la source
VALUES
.VALUES (...), (...)
) :(VALUES
, indiquant qu'elle peut être répétée séparée par des virgules. Et j'ai lié aux notes de publication de la version ajoutant la fonctionnalité, qui stipulent "Améliorez la syntaxe INSERT pour permettre l'insertion de plusieurs lignes via la clause VALUES".J'ai écrit du code ruby pour générer un seul insert à plusieurs lignes de 500 éléments à partir d'une série d'instructions d'insertion qui était considérablement plus rapide que l'exécution des insertions individuelles. Ensuite, j'ai simplement essayé de regrouper les multiples insertions dans une seule transaction et j'ai constaté que je pouvais obtenir le même type d'accélération avec beaucoup moins de code.
la source
Selon cette page, il n'est pas pris en charge:
Depuis la version 3.7.11, SQLite prend en charge l' insertion sur plusieurs lignes . Richard Hipp commente:
la source
Depuis la version 2012-03-20 (3.7.11), sqlite prend en charge la syntaxe INSERT suivante:
Lisez la documentation: http://www.sqlite.org/lang_insert.html
PS: veuillez attribuer +1 à la réponse / réponse de Brian Campbell. pas le mien! Il a d'abord présenté la solution.
la source
Comme les autres affiches l'ont dit, SQLite ne prend pas en charge cette syntaxe. Je ne sais pas si les INSERT composés font partie de la norme SQL, mais d'après mon expérience, ils ne sont pas implémentés dans de nombreux produits.
En passant, vous devez savoir que les performances INSERT dans SQLite sont considérablement améliorées si vous encapsulez plusieurs INSERT dans une transaction explicite.
la source
Oui, sql peut le faire, mais avec une syntaxe différente. La documentation SQLite est assez bonne, par la manière. Il vous indiquera également que la seule façon d'insérer plusieurs lignes est d' utiliser une instruction select comme source des données à insérer.
la source
Sqlite3 ne peut pas faire cela directement en SQL, sauf via un SELECT, et bien que SELECT puisse renvoyer une "ligne" d'expressions, je ne connais aucun moyen de lui faire retourner une colonne bidon.
Cependant, la CLI peut le faire:
Si vous mettez une boucle autour d'un INSERT, plutôt que d'utiliser la
.import
commande CLI , assurez-vous de suivre les conseils de la FAQ sqlite pour la vitesse INSERT:la source
.import
commande SQLite , c'est juste une boucle, lisant une ligne du fichier d'entrée (ou tty) puis une instruction INSERT pour cette ligne. Malheureusement, l'efficacité n'a pas été considérablement améliorée.Alex a raison: l'instruction "select ... union" perdra la commande, ce qui est très important pour certains utilisateurs. Même lorsque vous insérez dans une commande spécifique, sqlite change les choses, alors préférez utiliser les transactions si la commande d'insertion est importante.
la source
fearless_fool a une excellente réponse pour les anciennes versions. Je voulais juste ajouter que vous devez vous assurer que toutes les colonnes sont répertoriées. Donc, si vous avez 3 colonnes, vous devez vous assurer que la sélection agit sur 3 colonnes.
Exemple: J'ai 3 colonnes mais je veux seulement insérer 2 colonnes de données. Supposons que je ne me soucie pas de la première colonne, car il s'agit d'un identifiant d'entier standard. Je pourrais faire ce qui suit ...
Remarque: N'oubliez pas que l'instruction "select ... union" perdra la commande. (De AG1)
la source
la source
Vous ne pouvez pas, mais je ne pense pas que vous manquez rien.
Parce que vous appelez sqlite toujours en cours, peu importe les performances, que vous exécutiez 1 instruction d'insertion ou 100 instructions d'insertion. Cependant, la validation prend beaucoup de temps, alors mettez ces 100 insertions dans une transaction.
Sqlite est beaucoup plus rapide lorsque vous utilisez des requêtes paramétrées (beaucoup moins d'analyse syntaxique nécessaire), donc je ne concatène pas de grandes instructions comme ceci:
Ils doivent être analysés encore et encore car chaque déclaration concaténée est différente.
la source
dans mysql lite, vous ne pouvez pas insérer plusieurs valeurs, mais vous pouvez gagner du temps en ouvrant la connexion une seule fois, puis en faisant toutes les insertions et en fermant la connexion. Cela fait gagner beaucoup de temps
la source
Le problème avec l'utilisation de transaction est que vous verrouillez également la table pour la lecture. Donc, si vous avez vraiment beaucoup de données à insérer et que vous avez besoin d'accéder à vos données, par exemple un aperçu ou ainsi, cela ne fonctionne pas bien.
Le problème avec l'autre solution est que vous perdez l'ordre d'insertion
Dans le sqlite, les données seront stockées a, b, c, d ...
la source
J'utilise 3.6.13
Je commande comme ça:
Avec 50 enregistrements insérés à la fois, cela ne prend qu'une seconde ou moins.
Il est vrai que l'utilisation de sqlite pour insérer plusieurs lignes à la fois est très possible. Par @Andy a écrit.
merci Andy +1
la source
la source
Si vous utilisez le plug- in Sqlite manager firefox, il prend en charge les insertions en masseINSERT
des instructions SQL.En fait, il ne prend pas en charge cela, mais le navigateur Sqlite le fait (fonctionne sur Windows, OS X, Linux)
la source
J'ai une requête comme ci-dessous, mais avec le pilote ODBC, SQLite a une erreur avec "", dit-il. J'exécute vbscript dans HTA (Html Application).
la source
Sur sqlite 3.7.2:
etc
la source
Je peux rendre la requête dynamique. Voici ma table:
CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)
et j'obtiens toutes les données via un
JSON
, donc après avoir tout mis à l'intérieur d'un,NSArray
j'ai suivi ceci:Et enfin, la requête de sortie est la suivante:
qui fonctionne bien grâce au code également et je suis en mesure de tout enregistrer avec succès dans SQLite.
Avant cela, j'ai rendu les
UNION
requêtes dynamiques, mais cela a commencé à donner une erreur de syntaxe. Quoi qu'il en soit, cela fonctionne bien pour moi.la source
Je suis surpris que personne n'ait mentionné de déclarations préparées . À moins que vous n'utilisiez SQL seul et dans aucun autre langage, je pense que les instructions préparées enveloppées dans une transaction seraient le moyen le plus efficace d'insérer plusieurs lignes.
la source
vous pouvez utiliser InsertHelper, c'est simple et rapide
documentation: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
Didacticiel: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/
Edit: InsertHelper est obsolète à partir du niveau 17 de l'API
la source
Si vous utilisez le shell bash, vous pouvez utiliser ceci:
Ou si vous êtes en sqlite CLI, alors vous devez faire ceci:
Comment ça marche? Il utilise cette table if
tab
:puis
select a.id, b.id from tab a, tab b
retourneetc. Après la première exécution, nous insérons 2 lignes, puis 2 ^ 3 = 8. (trois parce que nous avons
tab a, tab b, tab c
)Après la deuxième exécution, nous insérons
(2+8)^3=1000
lignesAprès trois, nous insérons environ
max(1000^3, 5e5)=500000
lignes et ainsi de suite ...C'est la méthode la plus rapide connue pour remplir la base de données SQLite.
la source