¿Cómo insertar varias filas en SQLite?

Resuelto Andrew asked hace 14 años • 26 respuestas

En MySQL puedes insertar varias filas como esta:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

Sin embargo, recibo un error cuando intento hacer algo como esto. ¿Es posible insertar varias filas a la vez en una base de datos SQLite? ¿Cuál es la sintaxis para hacer eso?

Andrew avatar Oct 23 '09 03:10 Andrew
Aceptado

actualizar

Como BrianCampbell señala aquí , SQLite 3.7.11 y superiores ahora soportan la sintaxis más simple de la publicación original . Sin embargo, el enfoque que se muestra sigue siendo apropiado si desea la máxima compatibilidad entre bases de datos heredadas.

respuesta original

Si tuviera privilegios, respondería a la respuesta de River : puedes insertar varias filas en SQLite, solo necesitas una sintaxis diferente . Para que quede perfectamente claro, el ejemplo de OP MySQL:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

Esto se puede reformular en SQLite como:

     INSERT INTO 'tablename'
          SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'

una nota sobre el rendimiento

Originalmente utilicé esta técnica para cargar de manera eficiente grandes conjuntos de datos desde Ruby on Rails. Sin embargo , como señala Jaime Cook , no está claro que esto sea más rápido para envolver a un individuo INSERTsen una sola transacción:

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

Si su objetivo es la eficiencia, debería probar esto primero.

una nota sobre UNION vs UNION ALL

Como comentaron varias personas, si usa UNION ALL(como se muestra arriba), se insertarán todas las filas, por lo que en este caso, obtendrá cuatro filas de data1, data2. Si omites ALL, se eliminarán las filas duplicadas (y presumiblemente la operación será un poco más lenta). Estamos usando UNION ALL ya que coincide más con la semántica de la publicación original.

Para concluir

PD: haga +1 en la respuesta de River , ya que presentó la solución primero.

fearless_fool avatar Feb 15 '2011 21:02 fearless_fool

Sí, es posible, pero no con los valores de inserción habituales separados por comas.

Prueba esto...

insert into myTable (col1,col2) 
     select aValue as col1,anotherValue as col2 
     union select moreValue,evenMoreValue 
     union...

Sí, es un poco feo pero bastante fácil automatizar la generación de la declaración a partir de un conjunto de valores. Además, parece que solo necesita declarar los nombres de las columnas en la primera selección.

river avatar Nov 14 '2009 12:11 river