CSV→SQL変換(INSERT文生成)
CSVファイルをSQLのINSERT文・CREATE TABLE文に変換します。MySQL・PostgreSQL・SQLiteの3方言に対応し、列の型(整数・小数・文字列)を自動判定します。変換処理はブラウザ内で完結し、データはサーバーに送信されません。
| 区切り文字 |
|
|---|---|
| 先頭行を見出しとする | |
| テーブル名 | |
| SQL方言 |
|
| CREATE TABLE文も生成する | |
| 空欄の値をNULLとして扱う | |
| 複数行をまとめた1つのINSERT文にする |
CSVを入力すると、ここにSQL文が表示されます。
CSVの行とINSERT文の対応
| CSVの1行 | name,age,city |
|---|---|
| 変換後のINSERT文 | INSERT INTO `my_table` (`name`, `age`, `city`) VALUES ('Alice', 30, 'Tokyo'); |
先頭行を見出しとして使う場合、2行目以降の各行が、見出しの列名を指定した1つのINSERT文に変換されます。整数・小数として認識された列は引用符なしの数値として、それ以外はシングルクォートで囲んだ文字列として出力されます。
Tips
- 列の型(整数・小数・文字列)は、その列に含まれる全データ行の値を調べて自動判定されます。1件でも数値以外の値があればその列全体が文字列型として扱われます。
- 「複数行をまとめた1つのINSERT文にする」を有効にすると、`INSERT INTO ... VALUES (...), (...), (...);` という1文にまとまり、大量データを投入する際の実行回数を減らせます。
- MySQLはバッククォート(`)、PostgreSQL・SQLiteはダブルクォート(")でテーブル名・列名を囲むため、SQL方言の選択でクォート文字が自動的に切り替わります。
- 「空欄の値をNULLとして扱う」を無効にすると、空文字列は文字列型の列では空の文字列リテラル('')として、数値型の列ではNULLとして出力されます。
よくある質問
余談ですが ― INSERT文が「遅い」と言われる理由
本ツールで生成できる「複数行をまとめた1つのINSERT文」(`INSERT INTO t VALUES (1,'a'), (2,'b'), ...;`)は、1行ごとに個別のINSERT文を発行する場合に比べて実行が大幅に速くなることがあります。これは、データベースがSQL文を解析・実行計画に変換するオーバーヘッドや、トランザクションのコミット処理が文の数だけ繰り返されるコストを、まとめることで削減できるためです。
ただしMySQLには `max_allowed_packet`、PostgreSQLには類似の通信バッファ上限があり、あまりに大量の行を1つのINSERT文に詰め込むと、その上限を超えてエラーになることがあります。実務では数百〜数千行程度ごとに文を分割するのが一般的な運用です。
CSVファイルをテスト用データベースに投入する作業は、開発現場では「シードデータの準備」と呼ばれることが多く、Webフレームワークの多くが専用の仕組み(Laravelのseeder・factoryなど)を用意しているほど頻出のタスクです。本ツールのような変換ツールは、そうした仕組みを使うまでもない小規模な検証やデータ移行の際に手早く使える手段として重宝されます。