¿Cómo insertar varias filas en SQLite?
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?
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 INSERTs
en 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.
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.