mysql、postgresql、sqlite 导入纯 insert 文件需分别处理:mysql 要确保表存在、字符集一致并禁用 autocommit;postgresql 需单事务执行并注意语法兼容性;sqlite 必须显式加 begin/commit 事务包裹,否则极慢。
mysql 命令行导入 .sql 文件(仅 insert)
直接用 mysql 客户端执行即可,前提是目标库已存在、表结构已建好。别用图形工具点来点去,容易漏掉字符集或连接参数。
常见错误现象:ERROR 1146 (42S02): Table 'db.table' doesn't exist —— 不是文件问题,是表真没建;Incorrect string value —— 文件编码和连接字符集不一致。
- 确保终端/命令行的字符集与 SQL 文件一致(通常为
utf8mb4),执行前加SET NAMES utf8mb4;或在命令中指定:mysql --default-character-set=utf8mb4 -u user -p db_name - 如果文件很大(>100MB),跳过自动提交能显著提速:
mysql -u user -p db_name -e "SET autocommit=0; SOURCE /path/to/data.sql; COMMIT;" - 避免用
source命令在交互式 mysql 中导入超大文件——容易因超时中断,且无法看到实时进度
PostgreSQL 用 psql 导入纯 INSERT 文件
PostgreSQL 对纯 INSERT 文件兼容性好,但默认事务行为和 MySQL 不同:每条 INSERT 是独立事务,不批量提交就极慢。
使用场景:从 MySQL 导出后手动改写成 PostgreSQL 兼容格式(比如把反引号换成双引号、调整字符串转义),再导入。
- 强制单事务导入,大幅提升速度:
psql -U user -d db_name -v ON_ERROR_STOP=1 -f data.sql(-v ON_ERROR_STOP=1保证出错就停,不会继续插脏数据) - 如果文件里有
INSERT INTO table VALUES (...), (...), (...);这种多值写法,PostgreSQL 9.5+ 支持,旧版本会报错syntax error at or near ",",得拆成单条 - 注意
psql默认不识别/* */注释外的注释(如--后带空格),某些导出工具生成的注释可能引发解析失败,可先用sed '/^--/d'清理
SQLite 批量插入要关 autocommit,否则慢到怀疑人生
SQLite 的 .import 命令只认 CSV,不认 SQL;纯 INSERT 文件必须用 sqlite3 执行,但默认每条语句都 commit 一次。
一款AI办公效率工具,主要用于适用于兼容 Agent Skills 产品的通用(非 OpenClaw)Nutrient DWS 文档处理技能。最佳搭配:Claude Code、Codex CLI、Gemini CLI、Cursor、Wi...,适合需要提升相关任务效率的用户。
性能影响极大:10 万条 INSERT 可能从 2 秒变成 200 秒。
- 必须加
BEGIN TRANSACTION;和COMMIT;包裹全部INSERT,或者用命令行开关:sqlite3 db.sqlite ".read data.sql"前先确保data.sql以BEGIN;开头、COMMIT;结尾 - 如果文件没有事务包裹,临时补上:
echo 'BEGIN;' | cat - data.sql | echo 'COMMIT;' | sqlite3 db.sqlite(注意顺序,cat - data.sql是把 BEGIN 接在前面) - SQLite 不支持
INSERT ... ON CONFLICT以外的“忽略重复”逻辑,如果数据含主键冲突,要么提前清理,要么确认语句里写了OR IGNORE
文件内容本身容易被忽略的三个硬伤
表结构存在 ≠ 数据能成功导入。以下问题不报错但导致静默失败或数据截断。
-
INSERT语句字段数与表实际列数不匹配(尤其新增了 NOT NULL 列但没提供值),MySQL 可能用默认值填充,PostgreSQL 直接报错,SQLite 看 strict 模式是否开启 - 时间字段写成
'2023-01-01'没有时分秒,而列定义是TIMESTAMP NOT NULL—— MySQL 5.7+ 严格模式下会拒绝,低版本可能填'0000-00-00 00:00:00'并警告 - 数值字段含千分位逗号(如
1,234)或货币符号($123),数据库当字符串解析失败,整条语句跳过(MySQL 日志里能看到Truncated incorrect DOUBLE value)
最稳妥的做法:导入前用文本工具 grep 一下 INSERT 行数,再随机抽几条手工验证字段顺序、空值处理、特殊字符。别信“导出即可用”。










