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文に変換されます。整数・小数として認識された列は引用符なしの数値として、それ以外はシングルクォートで囲んだ文字列として出力されます。

CSV→SQL変換(INSERT文生成)とは

手元のCSVをデータベースへ投入したいとき、1行ずつINSERT文を書くのは現実的ではありません。このツールはCSVを読み取り、各行をINSERT文へ変換します。列の型は全データ行を走査して整数・小数・文字列を自動判定するため、CREATE TABLE文まで一緒に生成できます。

MySQL・PostgreSQL・SQLiteの3方言に対応し、選択に応じて識別子のクォート文字と型名が切り替わります。値に含まれるシングルクォートはSQL標準の方式で自動エスケープされるため、そのまま実行できます。処理はブラウザ内で完結し、CSVの内容が外部へ送られることはありません。

CSVからINSERT文を作る手順

  1. CSVを貼り付ける 入力欄にCSVを貼り付けます。タブ区切りの場合は区切り文字をタブに変更してください。
  2. テーブル名と方言を指定する 投入先のテーブル名を入力し、使用するデータベースの方言を選びます。識別子のクォート文字が自動で切り替わります。
  3. 出力の形を選ぶ CREATE TABLE文の同時生成、空欄をNULLとして扱うか、複数行を1つのINSERT文にまとめるかを指定します。
  4. コピーして実行する 生成されたSQLをコピーし、データベースクライアントへ貼り付けて実行します。件数が多い場合は分割して実行してください。

使いこなすためのヒント

  • 列の型(整数・小数・文字列)は、その列に含まれる全データ行の値を調べて自動判定されます。1件でも数値以外の値があればその列全体が文字列型として扱われます。
  • 「複数行をまとめた1つのINSERT文にする」を有効にすると、`INSERT INTO ... VALUES (...), (...), (...);` という1文にまとまり、大量データを投入する際の実行回数を減らせます。
  • MySQLはバッククォート(`)、PostgreSQL・SQLiteはダブルクォート(")でテーブル名・列名を囲むため、SQL方言の選択でクォート文字が自動的に切り替わります。
  • 「空欄の値をNULLとして扱う」を無効にすると、空文字列は文字列型の列では空の文字列リテラル('')として、数値型の列ではNULLとして出力されます。

CSV→SQL変換の活用シーン

テスト用のシードデータを用意する

表計算ソフトで作った検証データをそのままINSERT文に変換できます。フレームワークのシーダーを書くまでもない小規模な検証に向いています。

マスタデータを移行する

既存システムから書き出したCSVを、新しいデータベースへ投入する形へ変換できます。CREATE TABLE文も同時に得られます。

列の型を確認する

自動判定された型を見れば、想定外の値が混ざっている列に気づけます。数値のはずが文字列型になっていれば混入のサインです。

方言ごとの書き方を確かめる

同じCSVで方言を切り替えると、識別子のクォートや型名の違いを実例として比較できます。

SQL投入に関する用語

INSERT文
テーブルへ行を追加するSQLです。列名と値を対応させて指定します。
CREATE TABLE文
テーブルを新規に作るSQLです。列名と型を定義します。投入先がまだ無い場合に必要になります。
SQL方言
データベース製品ごとの構文の差異です。識別子を囲む記号や型名の綴りが異なります。
NULL
値が存在しないことを表す特別な値です。空文字列とは区別されるため、空欄の扱いを決める必要があります。
エスケープ
構文上の意味を持つ文字を、そのままの文字として扱わせる処理です。値に含まれるシングルクォートが対象になります。
バルクインサート
複数行を1つのINSERT文でまとめて投入する方式です。文の解析やコミットの回数が減り実行が速くなります。

よくある質問

その列に含まれるすべてのデータ行の値を調べ、全て整数表記であればINTEGER型、全て小数表記であればREAL型、それ以外(文字列や混在)であればTEXT型と自動判定します。CREATE TABLE文を生成する場合、この判定結果がそのまま列の型として出力されます。

はい。「SQL方言」でPostgreSQLまたはSQLiteを選択すると、テーブル名・列名のクォート文字(ダブルクォート)や型名がそれぞれのデータベースに準拠した形式で出力されます。

SQL標準のエスケープ方式に従い、シングルクォートは自動的に2つ重ねた表記('')に変換されるため、そのままSQL文として実行できます。

いいえ。変換処理はすべてブラウザ内のJavaScriptで行われ、入力したCSVの内容がサーバーに送信されることはありません。実データを含むCSVでも安心してご利用いただけます。
ツールくん

余談ですが ― 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など)を用意しているほど頻出のタスクです。本ツールのような変換ツールは、そうした仕組みを使うまでもない小規模な検証やデータ移行の際に手早く使える手段として重宝されます。