変数制限付きSQLite Bulk INSERT

SQLITE_MAX_VARIABLE_NUMBER制限を考慮したSQLite互換のBulk INSERT文を生成します。SQLiteのON CONFLICT構文も解説します。

Dialect Differences

詳細な説明

SQLite固有のBulk INSERT

SQLiteは軽量な組み込みデータベースであり、Bulk INSERT生成に影響する特有の制限があります。ツールはこれらの制約を考慮して互換性のある出力を生成します。

SQLite識別子のクォート

SQLiteは識別子にダブルクォートを使用します(PostgreSQLと同じ):

INSERT INTO "users" ("id", "name", "email")
VALUES
  (1, 'Alice', 'alice@example.com'),
  (2, 'Bob', 'bob@example.com');

変数数の制限

SQLiteの重要な制約はSQLITE_MAX_VARIABLE_NUMBERで、デフォルトは999です。Bulk INSERTの各値が1つの変数としてカウントされます:

max_rows_per_insert = floor(999 / カラム数)
カラム数 INSERT1文あたりの最大行数
5 199
10 99
15 66
20 49

推奨: SQLiteでは制限内に安全に収めるためバッチサイズ50-100を使用してください。

SQLiteのON CONFLICT

SQLiteはPostgreSQLのON CONFLICT構文のサブセットをサポートしています:

INSERT INTO "users" ("id", "name", "email")
VALUES
  (1, 'Alice', 'alice@example.com')
ON CONFLICT ("id") DO NOTHING;
INSERT INTO "users" ("id", "name", "email")
VALUES
  (1, 'Alice Updated', 'alice.new@example.com')
ON CONFLICT ("id") DO UPDATE SET
  "name" = EXCLUDED."name",
  "email" = EXCLUDED."email";

SQLite固有のヒント

  1. トランザクションを使用: SQLiteはトランザクション内で劇的に高速化
  2. WALモード: インポート中の並行読み取りのためにPRAGMA journal_mode=WALを有効化
  3. 控えめなバッチ: 999変数制限を十分に下回る設定に
  4. synchronousの無効化: BulkインポートではPRAGMA synchronous=OFFで高速化(ただしクラッシュ時のデータ損失リスクあり)

ユースケース

ローカルSQLiteデータベースを持つモバイルアプリを構築しており、JSONファイルから初期データをシードする必要がある場合。バッチサイズ50で互換性を確保しつつ、シードスクリプトを高速に保てます。

試してみる — JSON to Bulk INSERT

フルツールを開く