CSVからSQLへの変換ツール

CSVデータをデータベースに取り込むには、通常ローダーツールを起動するか、ローカルファイルでしか動作しないCOPY/LOAD DATA INFILEコマンドを書く必要があります。数十行、数百行、あるいは数千行程度の小規模なデータセットなら、任意のSQLコンソールに貼り付けられる素のINSERT文の方が手っ取り早いことがよくあります。このツールはCSVとテーブル名を受け取り、バッククォートで囲んだ識別子と、そのまま安全に実行できるシングルクォート付きの値を使って、1行につき1つのINSERT文を生成します。

SQLの構成方法

  1. 1

    CSVを貼り付ける

    ヘッダー行の有無を問わない標準的なCSVです。パーサーは引用符で囲まれたセル内の区切り文字も処理します。

  2. 2

    テーブル名を設定する

    テーブル名に含まれる英数字以外の文字はアンダースコアに置き換えられ、空欄の場合は`my_table`が使われます。

  3. 3

    列はヘッダーから取得される

    ヘッダーモードがオンの場合、1行目が列リストになります。オフの場合、列は`column_1`、`column_2`のように命名されます。

  4. 4

    データ行ごとに1つのINSERT

    各行が`INSERT INTO table (cols) VALUES (...)`になります。値はシングルクォートで囲まれ、値の中のシングルクォートは2つに重ねられます。

方言、クォート、そして別の手段を選ぶべきとき

このジェネレータは、識別子をバッククォートで、値をシングルクォートで囲むMySQL風のSQLを対象としています。ほとんどのデータベースでは、わずかな手直しでそのまま受け入れられます。

方言早見表

データベース 識別子のクォート 備考
MySQL バッククォート そのまま動作します。
MariaDB バッククォート そのまま動作します。
PostgreSQL 二重引用符 実行前に `" に置き換えてください。
SQLite 二重引用符 `" に置き換えるか、識別子のクォートを外してください。
SQL Server 角括弧 `[] に置き換えてください。Unicode には N'...' に注意。

値がエスケープされる仕組み

すべての値はシングルクォートで囲まれ、値の中に含まれるシングルクォートは2つに重ねられます(O'Brien'O''Brien' になります)。これはSQL-92の標準的な方法で、主要なデータベースすべてで動作します。このコンバーターは型変換を行わず、すべてを文字列リテラルとして出力するため、列が INT の場合はデータベースの暗黙的な変換によって '42' が整数に変わります。

きれいにインポートするためのヒント

  • 先にテーブルを作成してください。 コンバーターは INSERT 文だけを出力し、CREATE TABLE は出力しません。手動で定義したスキーマや、ORMから生成したスキーマと組み合わせて使ってください。
  • 大きなファイルは分割して。 SQLクライアントに文のサイズ制限がある場合は、一度に500〜1000行ずつ貼り付けてください。
  • トランザクションで囲む。 数百行を超える場合は、貼り付けた文の前後を BEGIN;COMMIT;(または START TRANSACTION; / COMMIT;)で囲んでください。1文ごとに自動コミットするよりもはるかに高速です。

SQL生成を使わないほうがよいとき

ファイルが約50,000行を超える場合は、ネイティブのバルクローダー(Postgresの COPY、MySQLの LOAD DATA INFILE、SQL Serverの bcp)のほうが、スクリプトで生成した INSERT より桁違いに高速です。このツールは、手早いインポート、テストデータの投入、一度きりのマイグレーションに向いています。

よくある質問

いいえ。出力するのは INSERT 文だけです。事前に CREATE TABLE でスキーマを自分で定義してください。そうすれば、コンバーターに推測させるのではなく、列の型・長さ・制約を自分でコントロールできます。

1か所だけ変更すれば動作します。テーブル名と列名を囲むバッククォートの識別子クォートを二重引用符に置き換えてください。値はシングルクォートで囲まれているので、SQL-92準拠のどの方言でも変更なしで実行できます。

値の中のシングルクォートは2つに重ねられます(O''Brien)。これは標準的なSQLのエスケープ方法です。バックスラッシュ、パーセント記号、アンダースコアはそのまま通過し、特殊な意味を持つのは LIKE パターンの中だけです。

はい。SQLを生成するためにCSVはサーバーへ送信されます。保存はされず、ページのリンクにも追加されません。

関連ツール