SQLite に複数の行を挿入するにはどうすればいいですか? 質問する

SQLite に複数の行を挿入するにはどうすればいいですか? 質問する

MySQL では、次のように複数の行を挿入できます。

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

しかし、このようなことをしようとするとエラーが発生します。SQLite データベースに一度に複数の行を挿入することは可能ですか? そのための構文は何ですか?

ベストアンサー1

アップデート

としてブライアン・キャンベルはここで指摘しているSQLite 3.7.11 以降では、元の投稿のよりシンプルな構文がサポートされるようになりました。ただし、従来のデータベース間で最大限の互換性が必要な場合は、ここで示したアプローチが依然として適切です。

元の回答

もし私に特権があったら、私はぶつかるだろう川の返事: SQLite では複数の行を挿入できますが、異なる構文が必要です。明確にするために、OP の MySQL の例を示します。

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

これを SQLite に書き直すと次のようになります。

     INSERT INTO 'tablename'
          SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'

パフォーマンスに関する注意事項

もともとこの手法は、Ruby on Railsから大規模なデータセットを効率的にロードするために使用していました。しかしジェイミー・クックが指摘するようにINSERTsただし、単一のトランザクション内で個別にラップする方が高速かどうかは明らかではありません。

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

効率が目標であれば、まずこれを試してみてください。

UNIONとUNION ALLに関する注意

UNION ALL何人かの人がコメントしているように、 (上記のように)を使用すると、すべての行が挿入されるため、この場合は の行が 4 つ得られますdata1, data2。 を省略するとALL、重複行は削除されます (操作はおそらく少し遅くなります)。元の投稿の意味により近いため、UNION ALL を使用しています。

最後に

追伸: +1をお願いします川の返事最初に解決策を提示したからです。

おすすめ記事