2012-04-10 25 views
7

Estoy tratando de insertar el registro 15530 en una determinada tabla con el shell SQLite3 pero me da error, busqué la solución SQLITE_MAX_COMPOUND_SELECT que por defecto es 500, pero no lo hago saber cómo cambiarlo usando Shell.Problema de SQLite al insertar un gran número de registros

"Error: demasiados términos en compuesto seleccionar"

http://desmond.imageshack.us/Himg861/scaled.php?server=861&filename=sqlite.jpg&res=landing

INSERT INTO table_name (my_id, my_name) VALUES 
(1, 'Aaliyah'), 
(2, 'Alvar Aalto'), 
(3, 'Willie Aames'), 
... 
(15530, 'name'); 
+1

La configuración de SQLITE_MAX_COMPOUND_SELECT no es su problema. * Debe reducir la cantidad de términos en su instrucción SELECT. * Muéstrenos el código que está usando. –

+1

@RobertHarvey, bueno, esa es la solución. Pero los límites/tamaños de matriz codificados, al tiempo que impiden que un desarrollador se vuelva loco o incluso que sea más eficiente que las alternativas, son una lástima por sí mismos. No es como sqlite tiene un equivalente a 'xargs' para dividir automáticamente inserciones masivas en las declaraciones más grandes posibles (o más comúnmente de tamaño eficiente) ... (¿o no?) – binki

Respuesta

4

INSERT INTO no funciona de esa manera.

Prueba esto:

BEGIN TRANSACTION 
INSERT INTO author (author_id, author_name) VALUES (1, 'Aaliyah') 
INSERT INTO author (author_id, author_name) VALUES (2, 'Alvar Aalto') 
INSERT INTO author (author_id, author_name) VALUES (3, 'Willie Aames') 
... 
END TRANSACTION 

http://www.sqlite.org/lang_insert.html

+0

Gracias, eso realmente me hizo pensar de manera diferente y reescribir la consulta para que coincida con este – enGMzizo

+7

Um sí, * does * funciona de esa manera, a partir de la versión 3.7.11. Ya no es necesario utilizar esta forma antigua de insertar filas, cada una en una inserción separada en una transacción. Entonces, ¿por qué la nueva forma afirma que estamos haciendo un compuesto seleccionado, cuando eso ya no es cierto (la consulta tiene "seleccionar" en ninguna parte)? – Michael

14

El valor múltiple INSERT INTO sintaxis era introduced in SQLite 3.7.11, por lo que la sintaxis original está muy bien en las últimas versiones de SQLite. En versiones anteriores, puede usar un alternative syntax.

Sin embargo, el límite SQLITE_MAX_COMPOUND_SELECTcannot be raised at runtime, por lo que debe dividir sus inserciones en lotes de 500 filas cada uno. Esto será más eficiente que insertar una fila por consulta. P.ej.

BEGIN; 
INSERT INTO table_name (id, name) VALUES (1, 'foo'), ..., (500, 'bar'); 
INSERT INTO table_name (id, name) VALUES (501, 'baz'), ..., (1000, 'zzz'); 
... 
COMMIT; 
+4

¿Por qué SQLite trata las multiinserciones como una selección cuando la sintaxis elimina todo eso? Esto no tiene sentido, especialmente a la luz de la documentación que dice: "Creemos que es una asignación generosa, ya que en la práctica casi nunca vemos la cantidad de términos en un compuesto que seleccionamos más de un dígito", pero de hecho podría tener miles o ¡millones de filas que quiero insertar en una sola declaración! – Michael

+1

@Michael, si está utilizando sqlite3, debe esperar este tipo de cosas porque ese es el punto de sqlite3: ser liviano, incluso si eso significa excluir ciertas comodidades que se encuentran en las pesadas DBs. Eso hace que la imposición de dimensiones de matriz codificadas en los usuarios sea aceptable en dicha biblioteca, e incluso en bases de datos pesadas, es posible que desee dividir un 'INSERT 'con una gran sección' VALUES' en múltiples 'INSERT's. – binki

Cuestiones relacionadas