変数制限付き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固有のヒント
- トランザクションを使用: SQLiteはトランザクション内で劇的に高速化
- WALモード: インポート中の並行読み取りのために
PRAGMA journal_mode=WALを有効化 - 控えめなバッチ: 999変数制限を十分に下回る設定に
- synchronousの無効化: Bulkインポートでは
PRAGMA synchronous=OFFで高速化(ただしクラッシュ時のデータ損失リスクあり)
ユースケース
ローカルSQLiteデータベースを持つモバイルアプリを構築しており、JSONファイルから初期データをシードする必要がある場合。バッチサイズ50で互換性を確保しつつ、シードスクリプトを高速に保てます。