1. ホーム
  2. sql

[解決済み] SQLiteデータベースで、一度に複数行を挿入することは可能ですか?

2022-03-16 09:11:26

質問

MySQLでは、このように複数行を挿入することができます。

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

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

解決方法を教えてください。

更新

として BrianCampbellがここで指摘しているのは , 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から大きなデータセットを効率的に読み込むために、このテクニックを使っていました。 しかし , Jaime Cookが指摘するように を個別にラップする方が速いというのは明らかではありません。 INSERTs を1つのトランザクションで実行します。

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してください 河野の返事 解決策を最初に提示しているので。