En MySQL puede insertar varias filas de esta manera:
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?
Respuestas:
actualizar
Como BrianCampbell señala aquí , SQLite 3.7.11 y superior ahora admite 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 las bases de datos heredadas.
respuesta original
Si tuviera privilegios, me encontraría con la respuesta de river : puede insertar varias filas en SQLite, solo necesita una sintaxis diferente . Para dejarlo perfectamente claro, el ejemplo de MySQL de OP:
Esto se puede refundir en SQLite como:
una nota sobre el rendimiento
Originalmente usé esta técnica para cargar eficientemente grandes conjuntos de datos de Ruby on Rails. Sin embargo , como señala Jaime Cook , no está claro si se trata de un individuo de envoltura más rápido
INSERTs
dentro de una sola transacción:Si su objetivo es la eficiencia, primero debe intentarlo.
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ía cuatro filas dedata1, data2
. Si omite elALL
, se eliminarán las filas duplicadas (y la operación presumiblemente será un poco más lenta). Estamos utilizando UNION ALL ya que coincide más con la semántica de la publicación original.Para concluir
PD: Por favor, haga +1 en la respuesta de river , ya que presentó la solución primero.
fuente
insert into t values (data),(data),(data)
obegin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;
?UNION ALL
para evitar eso (o para algunas ganancias menores de rendimiento).sqlite3.sqlite_version
(debe ser 3.7.xo 3.8.x), nosqlite3.version
(que es solo la versión del módulo de Python).Sí, es posible, pero no con los valores de inserción separados por comas habituales.
Prueba esto...
Sí, es un poco feo pero lo suficientemente fácil como para 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 columna en la primera selección.
fuente
UNION ALL
no useUNION
. Excepto si desea eliminar duplicados.Sí, a partir de SQLite 3.7.11 esto es compatible con SQLite. De la documentación de SQLite :
(cuando esta respuesta se escribió originalmente, esto no fue compatible)
Para la compatibilidad con versiones anteriores de SQLite, puede utilizar el truco sugerido por Andy y fearless_fool usando
UNION
, pero para 3.7.11 y más tarde la sintaxis más simple descrito aquí debe ser preferido.fuente
VALUES
.VALUES (...), (...)
) :(VALUES
, lo que indica que puede repetirse separada por comas. Y me vinculé a las notas de la versión para agregar la función, que dice "Mejorar la sintaxis INSERT para permitir que se inserten varias filas a través de la cláusula VALUES".Escribí un código ruby para generar una sola inserción de varias filas de 500 elementos a partir de una serie de instrucciones de inserción que fue considerablemente más rápido que ejecutar las inserciones individuales. Luego intenté simplemente envolver las múltiples inserciones en una sola transacción y descubrí que podía obtener el mismo tipo de velocidad con considerablemente menos código.
fuente
De acuerdo con esta página no es compatible:
Desde la versión 3.7.11 SQLite hace el apoyo de varias filas a insertar . Richard Hipp comenta:
fuente
Comience desde la versión 2012-03-20 (3.7.11), sqlite admite la siguiente sintaxis INSERT:
Lea la documentación: http://www.sqlite.org/lang_insert.html
PD: Por favor +1 a la respuesta / respuesta de Brian Campbell. ¡no es mio! Presentó la solución primero.
fuente
Como han dicho los otros carteles, SQLite no admite esta sintaxis. No sé si inserciones compuestas son parte del estándar SQL, pero en mi experiencia que están no implementado en muchos productos.
Además, debe tener en cuenta que el rendimiento de INSERT en SQLite mejora considerablemente si ajusta varios INSERT en una transacción explícita.
fuente
Sí, sql puede hacer esto, pero con una sintaxis diferente. La documentación de sqlite es bastante buena, por cierto. También le indicará que la única forma de insertar varias filas es usar una instrucción select como la fuente de los datos que se insertarán.
fuente
Sqlite3 no puede hacer eso directamente en SQL, excepto a través de SELECT, y aunque SELECT puede devolver una "fila" de expresiones, no conozco ninguna forma de hacer que devuelva una columna falsa.
Sin embargo, la CLI puede hacerlo:
Si coloca un bucle alrededor de un INSERT, en lugar de usar el
.import
comando CLI , asegúrese de seguir los consejos de las preguntas frecuentes de sqlite para la velocidad de INSERT:fuente
.import
comando SQLite , es solo un bucle, que lee una línea del archivo de entrada (o tty) y luego una instrucción INSERT para esa línea. Lamentablemente no mejora significativamente la eficiencia.Alex tiene razón: la declaración "select ... union" perderá el orden, lo cual es muy importante para algunos usuarios. Incluso cuando inserta en un orden específico, sqlite cambia las cosas, así que prefiera usar transacciones si el orden de inserción es importante.
fuente
fearless_fool tiene una excelente respuesta para versiones anteriores. Solo quería agregar que debe asegurarse de tener todas las columnas enumeradas. Entonces, si tiene 3 columnas, debe asegurarse de que select actúa en 3 columnas.
Ejemplo: tengo 3 columnas pero solo quiero insertar 2 columnas de datos. Supongamos que no me importa la primera columna porque es una identificación entera estándar. Podría hacer lo siguiente ...
Nota: Recuerde que la declaración "select ... union" perderá el orden. (De AG1)
fuente
fuente
No puedes pero no creo que extrañes nada.
Debido a que llama a sqlite siempre en proceso, casi no importa en el rendimiento si ejecuta 1 instrucción de inserción o 100 instrucciones de inserción. Sin embargo, la confirmación lleva mucho tiempo, así que inserte esos 100 insertos dentro de una transacción.
Sqlite es mucho más rápido cuando usa consultas parametrizadas (se necesita mucho menos análisis), por lo que no concatenaría declaraciones grandes como esta:
Deben analizarse una y otra vez porque cada declaración concatenada es diferente.
fuente
en mysql lite no puede insertar múltiples valores, pero puede ahorrar tiempo abriendo la conexión solo una vez y luego haciendo todas las inserciones y luego cerrando la conexión. Ahorra mucho tiempo
fuente
El problema con el uso de la transacción es que bloquea la tabla también para leer. Entonces, si tiene muchos datos para insertar y necesita acceder a sus datos, por ejemplo, una vista previa más o menos, esta forma no funciona bien.
El problema con la otra solución es que pierde el orden de inserción
En el sqlite los datos se almacenarán a, b, c, d ...
fuente
Estoy usando 3.6.13
Yo mando así:
Con 50 registros insertados a la vez, solo lleva un segundo o menos.
Es cierto que usar sqlite para insertar varias filas a la vez es muy posible. Por @Andy escribió.
gracias Andy +1
fuente
fuente
Si utiliza el complemento Firefox de Sqlite Manager , admite inserciones masivas deINSERT
sentencias SQL.De hecho, no es compatible con esto, pero Sqlite Browser sí (funciona en Windows, OS X, Linux)
fuente
Tengo una consulta como la siguiente, pero con el controlador ODBC, SQLite tiene un error con "", dice. Ejecuto vbscript en HTA (aplicación HTML).
fuente
En sqlite 3.7.2:
y así
fuente
Puedo hacer que la consulta sea dinámica. Esta es mi mesa:
CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)
y obtengo todos los datos a través de un
JSON
, así que después de obtener todo dentro de unNSArray
seguí esto:Y finalmente la consulta de salida es esta:
que también funciona bien a través del código y puedo guardar todo en SQLite con éxito.
Antes de esto, hice las
UNION
consultas dinámicas, pero eso comenzó a dar algunos errores de sintaxis. De todos modos, esto está funcionando bien para mí.fuente
Me sorprende que nadie haya mencionado declaraciones preparadas . A menos que esté utilizando SQL por sí solo y no dentro de ningún otro lenguaje, entonces pensaría que las declaraciones preparadas envueltas en una transacción serían la forma más eficiente de insertar múltiples filas.
fuente
puedes usar InsertHelper, es fácil y rápido
documentación: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
tutorial: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/
Editar: InsertHelper está en desuso a partir del API Nivel 17
fuente
Si está utilizando bash shell, puede usar esto:
O si está en sqlite CLI, entonces necesita hacer esto:
¿Como funciona? Utiliza esa tabla if
tab
:luego
select a.id, b.id from tab a, tab b
regresay así. Después de la primera ejecución, insertamos 2 filas, luego 2 ^ 3 = 8. (tres porque tenemos
tab a, tab b, tab c
)Después de la segunda ejecución, insertamos
(2+8)^3=1000
filas adicionalesDespués de esto, insertamos las
max(1000^3, 5e5)=500000
filas, etc.Este es el método más rápido conocido para mí de poblar bases de datos SQLite.
fuente