2012-04-10 2 views
7

SQLite3シェルを使用して特定のテーブルに15530レコードを挿入しようとしていますが、そのエラーが発生したため、SQLite_MAX_COMPOUND_SELECTを検索しました。それをShellを使って変更する方法を知っている。多数のレコードを挿入するとSQLiteの問題が発生する

"エラー:化合物中にあまりにも多くの用語が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

SQLITE_MAX_COMPOUND_SELECT設定は問題ではありません。 * SELECTステートメントの用語数を減らす必要があります。*使用しているコードを表示してください。 –

+1

@RobertHarvey、それは解決策です。しかし、ハードコードされた制限/配列サイズは、開発者が狂ったり、選択肢よりもパフォーマンスが高くなるのを防ぎながら、それ自体が残念である。それはsqliteが 'xargs'に相当するものではなく、自動的に大量の挿入を最大の(あるいは最も効率的なサイズの)ステートメントに分割するのと同じではありません... – binki

答えて

4

INSERT INTOはそのように動作しません。構文INTO

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

ありがとう、これに合わせて – enGMzizo

+7

うん、それはバージョン3.7.11のように*動作します。トランザクションの別々の挿入にそれぞれ行を挿入するこの古い方法を使用する必要はなくなりました。それでは、新しい方法で複合語選択を行っていると主張しているのですが、それはもはや真実ではありません(クエリはどこにも選択されていません)。 – Michael

14

複数値INSERTがintroduced in SQLite 3.7.11だったので、元の構文は、SQLiteのの最近のバージョンで結構です:

これを試してみてください。古いバージョンでは、alternative syntaxを使用できます。

ただし、制限はSQLITE_MAX_COMPOUND_SELECTcannot be raised at runtimeです。したがって、挿入をそれぞれ500行のバッチに分割する必要があります。これは、クエリごとに1つの行を挿入するより効率的です。例えば。

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

なぜSQLiteはシンタックスがそれを完全に取り除いてもマルチインサートを選択として扱いますか?特に、化合物中の用語の数が1桁を超えることはほとんど見られないので、これは寛大な配分であると考えていますが、実際には何千もの1つのステートメントに挿入したい数百万行 – Michael

+1

@Michael、sqlite3を使用している場合は、sqlite3のポイントであるため、このようなことを期待するべきです。それは、重量のあるDBで見つかった便利さを除外しても軽いことです。そのようなライブラリでは、ハードコードされた配列次元をユーザが受け入れることができ、重いデータベースであっても、大きな 'VALUES'セクションを持つ' INSERT'を複数の 'INSERT'に分割したいかもしれません。 – binki

関連する問題