JSON 转 SQL 完整指南 - 批量 INSERT 语句生成教程(2026)

1165 字
6 分钟
JSON 转 SQL 完整指南 - 批量 INSERT 语句生成教程(2026)

📖 JSON 转 SQL 完全指南#

在数据库开发和数据迁移中,经常需要将 JSON 数据转换为 SQL INSERT 语句。本指南将详细介绍所有转换技巧和最佳实践。


🎯 为什么需要 JSON 转 SQL?#

使用场景#

  1. 数据库初始化:快速填充测试数据
  2. 数据迁移:从 NoSQL 迁移到 SQL 数据库
  3. 批量导入:运营活动批量导入数据
  4. 开发测试:生成本地测试数据
  5. 数据备份:导出为 SQL 脚本

优势对比#

方式速度准确性适用场景
JSON 转 SQL快高批量数据
手动编写慢中少量数据
导入工具中高大文件

📝 SQL INSERT 语法#

基础语法#

-- 单条 INSERT
INSERT INTO table_name (column1, column2)
VALUES (value1, value2);
-- 批量 INSERT(推荐)
INSERT INTO table_name (column1, column2)
VALUES
(value1, value2),
(value3, value4),
(value5, value6);

不同数据库的差异#

MySQL:

INSERT INTO users (name, age)
VALUES ('张三', 25), ('李四', 30);

PostgreSQL:

INSERT INTO users (name, age)
VALUES ('张三', 25), ('李四', 30)
RETURNING id;

SQL Server:

INSERT INTO users (name, age)
VALUES ('张三', 25), ('李四', 30);

SQLite:

INSERT INTO users (name, age)
VALUES ('张三', 25), ('李四', 30);

🛠️ 转换方法#

方法 1:在线工具(推荐)#

工具:XingDian JSON to SQL

步骤:

  1. 粘贴 JSON 数组
  2. 输入表名
  3. 配置选项(批量大小、引号类型)
  4. 生成 SQL

优势:

  • ✅ 快速便捷
  • ✅ 自动转义
  • ✅ 支持批量
  • ✅ 完全免费

方法 2:手动转换#

JSON:

[
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30}
]

SQL:

INSERT INTO users (id, name, age) VALUES
(1, '张三', 25),
(2, '李四', 30);

方法 3:程序生成#

Node.js 示例:

function jsonToSQL(data, tableName) {
const keys = Object.keys(data[0]);
const columns = keys.join(', ');
const values = data.map(item => {
const vals = keys.map(key => {
const val = item[key];
if (typeof val === 'string') {
return `'${val.replace(/'/g, "''")}'`;
} else if (val === null) {
return 'NULL';
} else {
return val;
}
}).join(', ');
return `(${vals})`;
}).join(',\n');
return `INSERT INTO ${tableName} (${columns}) VALUES\n${values};`;
}

🔧 高级功能#

1. 批量大小控制#

// 每 1000 条一个 INSERT 语句
function batchInsert(data, tableName, batchSize = 1000) {
const batches = chunk(data, batchSize);
return batches.map(batch => {
return generateInsert(batch, tableName);
}).join('\n\n');
}

2. 字段映射#

const fieldMapping = {
'user_name': 'username',
'user_email': 'email',
'created_at': 'create_time'
};
function mapFields(data, mapping) {
return data.map(item => {
const mapped = {};
Object.keys(mapping).forEach(key => {
mapped[mapping[key]] = item[key];
});
return mapped;
});
}

3. 数据类型转换#

function convertType(value, type) {
switch (type) {
case 'string':
return `'${value.replace(/'/g, "''")}'`;
case 'number':
return value;
case 'boolean':
return value ? 'TRUE' : 'FALSE';
case 'date':
return `'${value}'`;
case 'null':
return 'NULL';
default:
return `'${value}'`;
}
}

4. 特殊字符转义#

function escapeSQL(value) {
if (typeof value !== 'string') return value;
return value
.replace(/\\/g, '\\\\') // 反斜杠
.replace(/'/g, "''") // 单引号
.replace(/"/g, '\\"') // 双引号
.replace(/\n/g, '\\n') // 换行
.replace(/\r/g, '\\r'); // 回车
}

💼 实战案例#

案例 1:用户数据导入#

JSON 数据:

[
{
"username": "zhangsan",
"email": "zhangsan@example.com",
"age": 25,
"created_at": "2026-01-01"
},
{
"username": "lisi",
"email": "lisi@example.com",
"age": 30,
"created_at": "2026-01-02"
}
]

生成 SQL:

INSERT INTO users (username, email, age, created_at) VALUES
('zhangsan', 'zhangsan@example.com', 25, '2026-01-01'),
('lisi', 'lisi@example.com', 30, '2026-01-02');

案例 2:产品数据迁移#

挑战:

  • 包含特殊字符(产品名称有引号)
  • 价格需要保留 2 位小数
  • 描述字段可能为 NULL

处理:

const products = data.map(p => ({
name: escapeSQL(p.name),
price: p.price.toFixed(2),
description: p.description ? `'${escapeSQL(p.description)}'` : 'NULL'
}));

案例 3:订单批量导入#

批量 INSERT:

-- 每 1000 条一个语句
INSERT INTO orders (order_id, user_id, total, status) VALUES
(1, 100, 99.99, 'pending'),
(2, 101, 199.99, 'paid'),
... (1000 rows);
INSERT INTO orders (order_id, user_id, total, status) VALUES
...;

⚠️ 常见问题#

Q1: 如何处理自增 ID?#

方案 A:跳过 ID 字段

INSERT INTO users (name, email) VALUES
('张三', 'zhangsan@example.com');
-- id 自动增长

方案 B:设置为 NULL

INSERT INTO users (id, name) VALUES
(NULL, '张三');

Q2: 特殊字符导致 SQL 错误?#

答:必须转义特殊字符,特别是单引号。

Q3: 支持 UPDATE 语句吗?#

答:本工具主要支持 INSERT,UPDATE 可使用其他方法。

Q4: 如何防止 SQL 注入?#

答:

  • 自动转义所有字符串
  • 不使用用户输入拼接 SQL
  • 使用参数化查询(生产环境)

🎯 最佳实践#

1. 事务处理#

START TRANSACTION;
INSERT INTO users ...;
INSERT INTO orders ...;
INSERT INTO products ...;
COMMIT;

2. 添加索引#

-- 导入后添加索引
CREATE INDEX idx_username ON users(username);
CREATE INDEX idx_email ON users(email);

3. 验证数据#

-- 导入后验证
SELECT COUNT(*) FROM users;
SELECT * FROM users LIMIT 10;

4. 错误处理#

-- 遇到错误继续执行
INSERT IGNORE INTO users ...;
-- 或回滚
INSERT INTO users ... ON DUPLICATE KEY UPDATE ...;

📊 性能优化#

批量大小建议#

数据量批量大小预计时间
<1,000单条<1 秒
1,000-10,0001,0001-5 秒
10,000-100,0005,0005-30 秒
>100,00010,00030 秒 +

优化技巧#

  1. 禁用索引(导入前)
ALTER TABLE users DISABLE KEYS;
-- 导入数据
ALTER TABLE users ENABLE KEYS;
  1. 调整参数
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
-- 导入数据
COMMIT;
  1. 使用 LOAD DATA(MySQL)
LOAD DATA INFILE 'data.csv'
INTO TABLE users
FIELDS TERMINATED BY ',';

🚀 立即使用#

在线工具:XingDian JSON to SQL

特点:

  • ⚡ 快速生成
  • 🔒 自动转义
  • 📦 批量支持
  • 🎨 灵活配置
  • 💾 多数据库支持

相关资源#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

最后更新于 2026-03-29,距今已过 201 天

部分内容可能已过时

公告
🎉 已升级 2.0 版本,欢迎使用。
分类
标签
站点统计
文章
197
分类
24
标签
747
总字数
334,099
运行时长
0 天
最后活动
0 天前

目录