2012-04-10 20 views
7

Sto cercando di inserire il record 15530 in una determinata tabella usando la shell SQLite3 ma ottengo quell'errore, ho cercato la soluzione SQLITE_MAX_COMPOUND_SELECT che per default è 500, ma non lo faccio sapere come cambiarlo usando Shell.SQLite Problema quando si inserisce un numero elevato di record

"Errore: troppi termini in compound SELECT"

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

L'impostazione SQLITE_MAX_COMPOUND_SELECT non è un problema. * È necessario ridurre il numero di termini nella dichiarazione SELECT. * Mostraci il codice che stai utilizzando. –

+1

@RobertHarvey, bene, questa è la soluzione. Ma i limiti hardcoded/le dimensioni degli array, pur impedendo a uno sviluppatore di diventare pazzo o persino più performante delle alternative, sono un peccato a tutti gli effetti. Non è come sqlite ha un equivalente a 'xargs' per dividere automaticamente gli inserimenti di massa nelle dichiarazioni più grandi (o più comunemente dimensionate) ... (o lo fa?) – binki

risposta

4

INSERT INTO non funziona in questo modo.

Prova questo:

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

Grazie, questo mi ha fatto pensare in modo diverso e riscrivere la query per abbinare questo – enGMzizo

+7

Eh si, * funziona * in questo modo, dalla versione 3.7.11. Non è più necessario utilizzare questo vecchio modo di inserire righe in un inserto separato in una transazione. Quindi, perché il nuovo modo di affermare che stiamo facendo una selezione composta, quando non è più vero (la query ha "selezionare" da nessuna parte in esso!)? – Michael

14

Il multiplo valore INSERT INTO sintassi era introduced in SQLite 3.7.11, quindi la sintassi originale è bene su versioni recenti di SQLite. Nelle versioni precedenti, è possibile utilizzare uno alternative syntax.

Tuttavia, il limite SQLITE_MAX_COMPOUND_SELECTcannot be raised at runtime, quindi è necessario dividere gli inserti in lotti di 500 righe ciascuno. Ciò sarà più efficiente dell'inserimento di una riga per query. Per esempio.

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

Perché SQLite considera i multi-inserimenti come una selezione quando la sintassi elimina completamente quella? Questo non ha senso, specialmente alla luce della documentazione che afferma: "Riteniamo che questa sia una ripartizione generosa, poiché in pratica non vediamo quasi mai il numero di termini in un composto che ecceda le singole cifre", ma in realtà potrei avere migliaia o milioni di righe che voglio inserire in una singola istruzione! – Michael

+1

@Michael, se stai usando sqlite3, dovresti aspettarti questo genere di cose perché questo è il punto di sqlite3: essere leggero anche se questo significa escludere certe comodità trovate nei DB pesanti. Questo rende le dimensioni degli array hardcoded agli utenti accettabili in una tale libreria, e anche nei database pesanti si potrebbe ancora voler dividere un 'INSERT' con una grande sezione' VALUES' in 'INSERT's multipli. – binki

Problemi correlati