550 votes

Est-il possible d'insérer plusieurs lignes à la fois dans une base de données SQLite?

En 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 le faire?

607voto

fearless_fool Points 9190

mise à jour

J'apprécie tous les points de réputation que j'ai eu sur cette réponse (c'était mon tout premier S. O. post!), mais comme BrianCampbell points ici, SQLite 3.7.11 et ci-dessus prend désormais en charge la plus simple, la syntaxe de l'original post. Cependant, l'approche présentée est toujours appropriée si vous désirez un maximum de compatibilité dans les bases de données existantes.

réponse originale à cette question

Si j'avais des privilèges, je bosse andy réponse: Vous pouvez insérer plusieurs lignes dans SQLite, vous avez juste besoin d' une syntaxe différente. Pour être parfaitement clair, la Fpo MySQL exemple:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data3', 'data4'),
  ('data5', 'data6'),
  ('data7', 'data8');

Cela peut être refondus dans SQLite:

 INSERT INTO 'tablename'
      SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION SELECT 'data3', 'data4'
UNION SELECT 'data5', 'data6'
UNION SELECT 'data7', 'data8'

J'ai été en utilisant ce "réquisitoire" les bases de données du RoR, et c'est une grande performance de gagner.
P. S.: Merci de +1 andy réponse, pas la mienne! Il a présenté la solution première.

561voto

andy Points 3414
<p>Oui c’est possible, mais pas avec l’habituel séparées par des virgules insérer des valeurs.<p>Essayez ceci...</p><pre><code></code></pre><p>Oui, c’est un peu laid mais assez facile à automatiser la génération de l’instruction d’un ensemble de valeurs. Il apparaît également, que vous devez seulement déclarer les noms de colonnes dans la première instruction select.</p></p>

241voto

Brian Campbell Points 101107

Oui, comme de SQLite 3.7.11 c'est pris en charge dans SQLite. À partir de l' SQLite documentation:

SQLite INSERT statement syntax

(lorsque cette réponse a été écrit à l'origine, ce n'était pas pris en charge)

Pour la compatibilité avec les anciennes versions de SQLite, vous pouvez utiliser l'astuce proposé par andy et fearless_fool l'aide d' UNION, mais pour 3.7.11 et, plus tard, le plus simple syntaxe décrite ici doit être préféré.

57voto

Jamie Cook Points 1669
<p>J’ai écrit un code ruby pour générer un seul insert de plusieurs rangées de 500 élément d’une série d’instructions insert qui était considérablement plus rapide que les inserts individuels en cours d’exécution. Ensuite, j’ai essayé encapsulant simplement les insertions multiples dans une seule transaction et constaté que je pouvais obtenir le même genre de vitesse vers le haut avec beaucoup moins de code.<pre><code></code></pre></p>

38voto

typeseven Points 612

Selon cette page, il n'est pas pris en charge:

  • 2007-12-03 : Multi-ligne d'en INSÉRER une.k.un. composé INSÉREZ pas pris en charge.
  INSERT INTO table (col1, col2) VALUES 
      ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...

En fait, selon le standard SQL92, une des VALEURS de l'expression doit être en mesure de se tenir debout sur elle-même. Par exemple, les éléments suivants doivent retourner une table d'une colonne de trois lignes: VALUES 'john', 'mary', 'paul';

À partir de la version 3.7.11 SQLite n' support multi-insertion de ligne. Richard Hipp commentaires:

"Le nouveau multi-valuées insert est purement syntaxique suger (sic) pour le composé insérer. Il n'y a pas d'avantage en termes de performance, d'une manière ou l'autre."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X