跳到工具
ViewCSV
无需上传文件

CSV 转 SQL

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', '磊 黄', '北京', 'Coffee beans 1kg', '7', '139.12', '2026-01-27', 'pending'),
  ('001042', '杰 徐', '北京', 'Coffee beans 1kg', '2', '132.10', '2026-02-14', 'shipped'),
  ('001043', '伟 孙', '上海', 'Notebook A5', '7', '129.75', '2026-03-22', 'pending'),
  ('001044', '敏 杨', '上海', 'Chair, ergonomic', '1', '122.25', '2026-04-25', 'paid'),
  ('001045', '静 王', '成都', 'Coffee beans 1kg', '9', NULL, '2026-05-15', 'refunded'),
  ('001046', '伟 黄', '北京', 'Desk lamp', '8', '104.23', '2026-06-06', 'refunded'),
  ('001047', ' 伟 吴 ', '成都', 'USB-C cable', '5', '225.65', '2026-07-08', 'refunded'),
  ('001048', '杰 李', '南京', 'Coffee beans 1kg', '7', '74.98', '2026-08-11', 'refunded'),
  ('001049', '磊 王', '南京', 'Monitor 27"', '9', '223.84', '2026-09-22', 'pending'),
  ('001050', '艳 吴', '南京', 'Desk lamp', '3', '91.94', '2026-01-02', 'shipped'),
  ('001051', '娜 刘', '深圳', 'Monitor 27"', '2', '216.98', '2026-02-18', 'pending'),
  ('001052', '磊 刘', '上海', 'Chair, ergonomic', '8', '136.30', '2026-03-22', 'pending'),
  ('001053', '静 张', '北京', 'Desk lamp', '4', '238.82', '2026-04-25', 'pending'),
  ('001054', '艳 陈', '南京', 'USB-C cable', '4', '95.92', '2026-05-21', 'paid'),
  ('001043', '伟 孙', '上海', 'Notebook A5', '7', '129.75', '2026-03-22', 'pending');
COMMIT;

15 行 · 1 个文件

打开或粘贴 CSV 文件,选择 数据库 和 语句,脚本就会显示在选项旁边。默认生成一个 PostgreSQL 事务:先用 CREATE TABLE IF NOT EXISTS 建一张全为 TEXT 列的表,再以每条 100 行的 INSERT 写入数据,所以 00412 仍是 '00412'。如果表中需要数字、布尔和 DATE 类型的列,请选择 识别数字和 true/false。文件在你的浏览器中转换,不会上传。

如何把 CSV 转换为 SQL

  1. 打开 .csv、.tsv 或 .txt 文件,拖到工具上,或粘贴数据。分隔符会自动识别;可在 导入设置 中设置分隔符、表头行,或选择 Windows-1252、GB18030 等旧编码。
  2. 选择 数据库:PostgreSQL、MySQL / MariaDB、SQLite 或 SQL Server。检查 表名:它初始为文件名,其中的空格和标点会变成下划线(sales report.csv 变成 sales_report)。
  3. 选择 语句;如果是 UPSERT、UPDATE 或 DELETE,请勾选能标识一行的 关键列。
  4. 检查预览,然后点击 复制,或下载 .sql 文件,用数据库客户端运行,例如 psql -f data.sql。

要用相同设置为多个文件生成脚本,请选择 批量转换多个文件。每个文件依次转换,脚本打包成一个 ZIP 一起下载。

语句与选项

INSERT多行的 INSERT INTO … VALUES 语句。每条 INSERT 的行数 决定一条语句包含多少行(1–1,000,默认 100);SQL Server 不接受超过 1,000 行。
UPSERT(插入或更新)每行一条语句:插入该行,或更新关键值相同的现有行。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)),每个值都是带引号的字符串字面量,所以前导零、长编号和特殊格式的日期都能原样导入。

使用 识别数字和 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 类型的列,值写为 1/0;在 SQLite 中生成 INTEGER 类型的列,值同样写为 1/0。
YYYY-MM-DD 格式的日期DATE,值带引号,例如 '2026-03-01';SQLite 中为 TEXT。日期时间和其他日期格式保持为文本。
  • 表名和列名完全按原样加引号,所以空格、保留字和中文等非拉丁名称都能使用:PostgreSQL 和 SQLite 中为 "order date",MySQL 中为 ` order date ,SQL Server 中为 [order date]`。名称中的引号字符会写成两个。
  • 值中的单引号会写成两个(O'Brien 变成 'O''Brien')。对于 MySQL,反斜杠也会写成两个,因为 MySQL 默认把 \ 当作转义符。SQL Server 的字面量会加上 N 前缀,以保留 Unicode 文本(包括中文)。
  • CSV 中带引号的值内的换行,会保留在 SQL 字符串字面量中。
  • 大多数数据库无法保存 NUL 字符;这些字符会被删除,工具会报告删除了多少个。

常见问题排查

  • 脚本中所有内容都在一列里。 分隔符识别错了;请在 导入设置 中设置后重新打开文件。
  • 数字列变成了 TEXT。 至少有一个值不是普通数字,例如 12 kg、1,5 或 007。可以在 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 行,文件分块读取两遍(第一遍了解列的类型和宽度,第二遍写出脚本),下载内容包含所有行。单个脚本最大 4 GB。

转换在当前标签页的后台线程中进行,所以页面保持流畅,点击 取消 即可停止。CSV 文件不会发送到任何服务器。如果想直接得到数据库文件而不是脚本,请使用 CSV 转 SQLite。

示例

一份客户列表,包含带前导零的 ID、带撇号和逗号的姓名,以及一个空的套餐值,使用默认设置转换,表名为 customers。如果选择 识别数字和 true/false,signup_date 会变成 DATE,monthly_fee 会变成 NUMERIC 并以不带引号的 29.00 写出,active 会变成 BOOLEAN 并写成 TRUE/FALSE,而 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 语法。下载前请选择对应的 数据库;为一种数据库生成的脚本不能直接用于其他数据库。

能生成 COPY 或 LOAD DATA 命令,而不是 INSERT 吗?

不能。脚本使用标准的 INSERT、UPSERT、UPDATE 或 DELETE 语句。如果数据量非常大,可以考虑使用数据库自带的批量导入工具直接读取 CSV,例如 PostgreSQL 的 COPY 或 MySQL 的 LOAD DATA。

标准与参考资料