2012-04-10 3 views
7

Próbuję wstawić rekord 15530 w pewnej tabeli przy użyciu powłoki SQLite3, ale dostaję ten błąd, szukałem rozwiązania SQLITE_MAX_COMPOUND_SELECT, którego domyślna wartość to 500, ale ja nie wiedzieć, jak to zmienić za pomocą Shell.Problem z SQLite podczas wstawiania dużej liczby rekordów

"Błąd: zbyt wiele terminów w związku 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

Ustawienie SQLITE_MAX_COMPOUND_SELECT nie jest problemem. * Musisz zredukować liczbę terminów w instrukcji SELECT. * Pokaż nam kod, którego używasz. –

+1

@RobertHarvey, cóż, takie jest rozwiązanie. Ale ograniczone wartości graniczne/rozmiary tablic, jednocześnie uniemożliwiając deweloperowi stanie się szalony, a nawet bardziej wydajne niż alternatywy, szkoda same w sobie. To nie tak, że sqlite ma odpowiednik 'xargs', aby automatycznie dzielić zbiorcze wstawki w możliwie najszersze (lub najczęściej efektywnie) instrukcje ... (czy tak?) – binki

Odpowiedz

4

INSERT INTO nie działa w ten sposób.

Spróbuj tego:

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

Dzięki, To naprawdę sprawiło, że pomyślałem inaczej i przepisałem zapytanie aby dopasować to – enGMzizo

+7

Um tak, to * działa * tak, jak w wersji 3.7.11. Nie ma już potrzeby korzystania z tego starego sposobu wstawiania wierszy, każdy w osobnej wkładce w transakcji. Dlaczego więc nowy sposób twierdzi, że robimy wybór złożony, kiedy to nie jest już prawdą (zapytanie ma "wybierz" nigdzie w nim!)? – Michael

14

wielokrotność wartości INSERT INTO składni był introduced in SQLite 3.7.11, więc oryginalna składnia jest w porządku na ostatnich wersjach SQLite. W starszych wersjach można użyć numeru alternative syntax.

Jednak limit SQLITE_MAX_COMPOUND_SELECTcannot be raised at runtime, więc trzeba podzielić swoje wkładki na partie po 500 rzędów. Będzie to bardziej efektywne niż wstawianie jednego wiersza na zapytanie. Na przykład.

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

Dlaczego SQLite traktuje wstawianie wielokrotne jako selekcja, gdy składnia znika z tym w ogóle? To nie ma sensu, szczególnie w świetle dokumentacji, która stwierdza: "Uważamy, że jest to hojny przydział, ponieważ w praktyce prawie nigdy nie widzimy liczby terminów w złożonym wyborze przekraczają pojedyncze cyfry", ale w rzeczywistości mogę mieć tysiące lub miliony wierszy, które chcę wstawić do pojedynczej instrukcji! – Michael

+1

@Michael, jeśli używasz sqlite3, powinieneś się tego spodziewać, ponieważ jest to kwestia sqlite3: być lekkim, nawet jeśli oznacza to wyłączenie pewnych udogodnień znajdujących się w dużych blokach DB. To sprawia, że ​​nakładanie wymuszonych wymiarów tablicy na użytkowników akceptowalnych w takiej bibliotece, a nawet w bazach danych o dużej wadze, może nadal chcieć podzielić "WSTAW" z dużą sekcją 'VALUES' na wiele' INSERT'ów. – binki