ツールへ移動
ViewCSV
ファイルはアップロードされません

CSV を SQL の INSERT 文に変換

orders.csv· サンプル15 行 · 8 列
キー列
UPSERT・UPDATE・DELETE には必須です。テーブル作成時には主キーとして使います。
値の型
BEGIN;
CREATE TABLE IF NOT EXISTS "orders" (
  "order_id" TEXT,
  "customer" TEXT,
  "city" TEXT,
  "product" TEXT,
  "quantity" TEXT,
  "unit_price" TEXT,
  "order_date" TEXT,
  "status" TEXT
);
INSERT INTO "orders" ("order_id", "customer", "city", "product", "quantity", "unit_price", "order_date", "status") VALUES
  ('001041', '悠真 吉田', '札幌', 'USB-C cable', '1', '79.89', '2026-01-13', 'paid'),
  ('001042', '颯太 中村', '名古屋', 'USB-C cable', '5', '77.86', '2026-02-07', 'refunded'),
  ('001043', '陽翔 中村', '東京', 'Notebook A5', '3', '172.84', '2026-03-14', 'paid'),
  ('001044', '大和 渡辺', '名古屋', 'Notebook A5', '9', '48.54', '2026-04-26', 'shipped'),
  ('001045', '陽翔 吉田', '横浜', 'USB-C cable', '1', NULL, '2026-05-18', 'pending'),
  ('001046', '葵 山本', '大阪', 'USB-C cable', '4', '63.78', '2026-06-21', 'paid'),
  ('001047', ' 蓮 山本 ', '横浜', 'Chair, ergonomic', '9', '211.49', '2026-07-27', 'paid'),
  ('001048', '陽翔 吉田', '札幌', 'Coffee beans 1kg', '5', '122.04', '2026-08-04', 'paid'),
  ('001049', '湊 山本', '福岡', 'Chair, ergonomic', '4', '122.11', '2026-09-19', 'refunded'),
  ('001050', '蓮 小林', '大阪', 'Monitor 27"', '6', '230.79', '2026-01-21', 'shipped'),
  ('001051', '芽依 加藤', '神戸', 'Desk lamp', '8', '173.37', '2026-02-04', 'pending'),
  ('001052', '陽翔 山田', '名古屋', 'Notebook A5', '6', '192.93', '2026-03-06', 'shipped'),
  ('001053', '陽葵 小林', '京都', 'Notebook A5', '1', '111.89', '2026-04-07', 'shipped'),
  ('001054', '陽葵 加藤', '大阪', 'Chair, ergonomic', '4', '169.55', '2026-05-17', 'paid'),
  ('001043', '陽翔 中村', '東京', 'Notebook A5', '3', '172.84', '2026-03-14', 'paid');
COMMIT;

15 行 · 1 ファイル

CSV ファイルを開くか貼り付けて、データベース と ステートメント を選ぶと、オプションの横にスクリプトが表示されます。既定では、TEXT 型の列による CREATE TABLE IF NOT EXISTS と、100 行ずつの INSERT をまとめた PostgreSQL のトランザクションになるため、00412 は '00412' のまま保たれます。テーブルに数値、真偽値、DATE の列を作りたい場合は、数値と true/false を判定する を選んでください。ファイルはブラウザー内で変換され、アップロードされることはありません。

CSV を SQL に変換する手順

  1. .csv、.tsv、.txt ファイルを開くか、ツールにドロップするか、行を貼り付けます。区切り文字は自動で判定されます。必要に応じて、読み込み設定 で区切り文字、見出し行、Windows-1252 などの従来の文字コードを設定してください。
  2. データベース を PostgreSQL、MySQL / MariaDB、SQLite、SQL Server から選びます。テーブル名 を確認してください。初期値はファイル名で、空白や記号はアンダースコアに置き換えられます(sales report.csv は sales_report になります)。
  3. ステートメント を選びます。UPSERT、UPDATE、DELETE の場合は、行を特定する キー列 にチェックを入れます。
  4. プレビューを確認してから、コピー を選ぶか .sql ファイルをダウンロードし、データベースのクライアントで実行します(例:psql -f data.sql)。

多数のファイルを同じ設定でスクリプトにするには、一括変換:複数のファイルを変換 を選びます。各ファイルが順に変換され、スクリプトはまとめて 1 つの ZIP としてダウンロードされます。

ステートメントとオプション

INSERT複数行の INSERT INTO … VALUES ステートメントです。1 つの INSERT あたりの行数 で、1 つのステートメントにまとめる行数を指定します(1~1,000、既定は 100)。SQL Server では 1,000 行を超えるとエラーになります。
UPSERT(挿入または更新)行ごとに 1 つのステートメントで、その行を挿入するか、同じキーを持つ既存の行を更新します。PostgreSQL と SQLite では ON CONFLICT (…) DO UPDATE SET … = excluded.…、MySQL では ON DUPLICATE KEY UPDATE、SQL Server では MERGE を使います。対象のテーブルには、キー列に主キーまたは一意インデックスが必要です。
UPDATEすべての行について UPDATE … SET … WHERE key = … を書き出します。キー列は変更されません。すべての列がキーの場合は更新するものがないため、ステートメントは書き出されません。
DELETEすべての行について DELETE FROM … WHERE key = … を書き出します。キーの値が空の場合は IS NULL になります。
キー列UPSERT、UPDATE、DELETE には必須です。WHERE のキーがない状態でこれらのステートメントが書き出されることはありません。CREATE TABLE を追加 がオンの場合、キー列は NOT NULL かつ PRIMARY KEY になります。
CREATE TABLE を追加既定でオンです。CREATE TABLE IF NOT EXISTS を書き出します(SQL Server の場合や DROP の後では、通常の CREATE TABLE)。
先頭に DROP TABLE IF EXISTS を追加同じ名前の既存のテーブルを置き換えます。既定ではオフです。スクリプトを実行すると、元のテーブルとそのデータは失われます。
トランザクションで囲む既定でオンです。BEGIN; … COMMIT; で囲みます(MySQL では START TRANSACTION;、SQL Server では BEGIN TRANSACTION;)。
空のセルを NULL として出力既定でオンです。オフにすると、空のセルは '' として書き出されます。

列の型と引用符の付け方

すべての値を文字列のまま扱う(既定)では、すべての列が TEXT(SQL Server では NVARCHAR(MAX))になり、すべての値が引用符付きの文字列リテラルになるため、先頭のゼロ、桁数の多い ID、変わった形式の日付もそのまま読み込まれます。

数値と true/false を判定する では、空でないすべての値が当てはまる場合にだけ、列に型が付きます。

整数INTEGER、または 9 桁を超える値がある場合は BIGINT になります。値は引用符なしで書き出されます。先頭がゼロの数値や 9,007,199,254,740,991 を超える数値がある列は、文字列のままです。
小数(有効数字 15 桁まで)PostgreSQL では NUMERIC、MySQL と SQL Server ではデータに合わせた桁数の DECIMAL(p,s)、SQLite では REAL になります。1,5 のように小数点にコンマを使った値がある列は、文字列のままです。
true / false(大文字・小文字を問わない)PostgreSQL と MySQL では真偽値型の BOOLEAN になり、値は TRUE/FALSE で書き出されます。SQL Server では BIT 型、SQLite では INTEGER 型になり、どちらも値は 1/0 で書き出されます。
YYYY-MM-DD 形式の日付'2026-03-01' のような引用符付きの値の DATE になります。SQLite では TEXT です。日時やそれ以外の日付の形式は文字列のままです。
  • テーブル名と列名は書かれたとおりに引用符で囲むため、空白、予約語、ラテン文字以外の名前も使えます。PostgreSQL と SQLite では "order date"、MySQL では ` order date 、SQL Server では [order date]` となります。名前の中の引用符は 2 つ重ねます。
  • 値の中の単一引用符は 2 つ重ねます(O'Brien は 'O''Brien' になります)。MySQL は既定で \ をエスケープ文字として扱うため、MySQL 用ではバックスラッシュも 2 つ重ねます。SQL Server のリテラルには、Unicode の文字列が保たれるよう N の接頭辞が付きます。
  • CSV の引用符で囲まれた値の中の改行は、SQL の文字列リテラルの中にそのまま残ります。
  • NUL 文字はほとんどのデータベースで保存できないため削除され、その件数が表示されます。

SQL スクリプトの実行に失敗する場合

  • スクリプトがすべて 1 つの列になっている。 区切り文字の判定が誤っています。読み込み設定 で指定し、ファイルを開き直してください。
  • 数値の列が TEXT になった。 12 kg、1,5、007 など、単純な数値でない値が少なくとも 1 つあります。CSV ビューアー で見つけるか、CSV データのクリーニング でその列を修正してください。
  • UPSERT が制約の不足で失敗する。 ON CONFLICT と ON DUPLICATE KEY は、対象のテーブルのキー列に主キーまたは一意インデックスがある場合にだけ機能します。既存のテーブルにインデックスを追加するか、CREATE TABLE を追加 でキーを作成してください。
  • MySQL や SQL Server で PRIMARY KEY がエラーになる。 文字列のままのキー列は TEXT(MySQL/MariaDB)または NVARCHAR(MAX)(SQL Server)として作成されますが、どちらのデータベースもこれらの型の全体にはインデックスを作成できません。VARCHAR のキーでテーブルを自分で作成してから、CREATE TABLE を追加 をオフにしてください。
  • SQL Server でテーブルがすでに存在すると表示される。 SQL Server 用のスクリプトでは、通常の CREATE TABLE を使います。既存のテーブルに読み込むには CREATE TABLE を追加 をオフにし、置き換えるには 先頭に DROP TABLE IF EXISTS を追加 をオンにしてください。
  • スクリプトが途中で止まる。 データベースのエラーに、失敗したステートメントが示されます。よくある原因は、キーの重複や、既存のテーブルの列の型に合わない値です。CSV のチェック でファイルを確認してから、スクリプトをもう一度実行してください。

大きなファイルと制限

25 MB、10万行、200万セルまでのファイルは、リアルタイムのプレビュー付きで開きます。それより大きなファイルはストリーミング方式で変換します。プレビューには先頭 200 行が表示され、ファイルを分割して 2 回読み込み(1 回目で列の型と幅を確認し、2 回目でスクリプトを書き出す)、ダウンロードにはすべての行が含まれます。1 つのスクリプトは 4 GB までです。

変換はこのタブ内のバックグラウンドのワーカーで実行されるため、ページの操作が止まることはなく、キャンセル で中止できます。CSV がサーバーに送信されることはありません。スクリプトではなく、すぐに使えるデータベース ファイルが必要な場合は、CSV を SQLite に変換 を使ってください。

例:顧客リストを PostgreSQL の INSERT 文に変換

先頭がゼロの ID、アポストロフィとコンマを含む名前、空のプランを含む顧客リストを、既定の設定とテーブル名 customers で変換した例です。数値と true/false を判定する を選ぶと、signup_date は DATE に、monthly_fee は引用符なしの 29.00 を持つ NUMERIC に、active は TRUE/FALSE を持つ BOOLEAN になり、customer_id は TEXT のままです。

CSV
customer_id,name,signup_date,plan,monthly_fee,active
00412,"O'Brien, Kate",2026-03-01,pro,29.00,true
00413,Luis Ortega,2026-03-04,,0,false
SQL(PostgreSQL)
BEGIN;
CREATE TABLE IF NOT EXISTS "customers" (
  "customer_id" TEXT,
  "name" TEXT,
  "signup_date" TEXT,
  "plan" TEXT,
  "monthly_fee" TEXT,
  "active" TEXT
);
INSERT INTO "customers" ("customer_id", "name", "signup_date", "plan", "monthly_fee", "active") VALUES
  ('00412', 'O''Brien, Kate', '2026-03-01', 'pro', '29.00', 'true'),
  ('00413', 'Luis Ortega', '2026-03-04', NULL, '0', 'false');
COMMIT;

よくある質問

既定ですべての列が TEXT になるのはなぜですか?

CSV には型がなく、推測を誤るとデータが失われるからです。00412 のような ID を整数として保存すると 412 になってしまいます。文字列にすれば、ファイルの内容がそのまま読み込まれます。数値、真偽値、DATE の列が必要な場合は、数値と true/false を判定する を選んでください。

スクリプトはどのデータベースで実行できますか?

PostgreSQL、MySQL と MariaDB、SQLite、SQL Server です。識別子の引用符、文字列のエスケープ、真偽値、UPSERT の構文は、それぞれのデータベースに合わせて書き出されます。ダウンロードする前に対応する データベース を選んでください。あるデータベース用のスクリプトは、ほかのデータベースではそのまま使えません。

INSERT の代わりに COPY や LOAD DATA のコマンドを生成できますか?

できません。スクリプトでは、標準的な INSERT、UPSERT、UPDATE、DELETE のステートメントを使います。非常に大量のデータを読み込む場合は、PostgreSQL の COPY や MySQL の LOAD DATA など、CSV を直接読み込むデータベース独自の一括読み込み機能を検討してください。

規格と参考資料