Navicat批量导入CSV应避免使用导入向导,而需通过SQL命令(MySQL用LOAD DATA LOCAL INFILE,PostgreSQL用psql+COPY)或Python脚本实现;注意文件路径、编码、字段匹配及数据校验。
Navicat 批量导入 CSV:别用“导入向导”点十次
navicat 自带的 导入向导 一次只认一个文件,点开、选表、映射字段、确认……导 20 个 csv 就得重复 20 轮,中途点错一次还得重来。这不是批量,是“手动批处理”。真要批量,得绕过图形界面,用它内置的 运行 sql 文件 + load data infile(mysql)或 copy(postgresql)能力,或者靠外部脚本驱动。
MySQL 用户:用 LOAD DATA INFILE 一次性塞多个文件
Navicat 支持执行原生 SQL,而 MySQL 的 LOAD DATA INFILE 效率远高于图形导入,且能写进 SQL 文件里反复跑。但注意:它只能加载服务器本地路径的文件(不是你电脑上的 CSV),所以得先把 CSV 传到数据库服务器(比如 /tmp/data_1.csv)。
常见错误现象:ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option —— 这说明 MySQL 只允许从特定目录读文件,查 SHOW VARIABLES LIKE 'secure_file_priv'; 看准路径再放文件。
- 确保 CSV 字段顺序、数量和目标表列严格一致;不一致会静默截断或报错
- 用
LOCAL关键字(即LOAD DATA LOCAL INFILE)可读本地文件,但需 Navicat 连接时勾选Allow local file import(在连接属性 → SSH/SSL 标签页下) - 示例语句(注意引号、分隔符、换行符):
LOAD DATA LOCAL INFILE '/Users/me/order_202401.csv' INTO TABLE orders FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
PostgreSQL 用户:COPY 更快,但 Navicat 不直接支持多文件
PostgreSQL 的 COPY 命令速度碾压 GUI 导入,但它默认只接受服务端路径或 stdin。Navicat 的 SQL 执行窗口无法直接传本地 CSV 给 COPY(会报 must be superuser to COPY from a file 或路径不可达)。所以实际做法是:用 psql 命令行配合 shell 脚本批量跑,再把结果表同步回 Navicat 查看。
使用场景:你有 50 个同结构 CSV,想全塞进一张 raw_logs 表——与其在 Navicat 里点,不如写三行 shell:
for f in *.csv; do psql -d mydb -c "\COPY raw_logs FROM '$f' WITH (FORMAT CSV, HEADER true)"; done- 确保所有 CSV 编码为 UTF8,字段数一致,否则某一个失败会中断后续
- Navicat 里刷新表后就能看到合并结果;别指望在“导入向导”里选中多个 CSV 文件——它根本不支持多选
跨数据库通用技巧:用 Python 脚本驱动 Navicat 连接
Navicat 本身不提供批量导入 API,但你可以用 Python 的 pymysql 或 psycopg2 直连数据库,读 CSV、拼 INSERT、批量提交。这比 GUI 稳定,还能加日志、跳过坏行、自动建表。
容易踩的坑:INSERT INTO ... VALUES (...), (...), (...) 一次插太多行会触发 MySQL 的 max_allowed_packet 限制(默认 4MB);建议每 1000 行提交一次。
- 别用
csv.reader直接读含换行符、逗号的字段——改用pandas.read_csv或csv.DictReader配合quoting=csv.QUOTE_MINIMAL - 字段名含空格或特殊字符?SQL 里必须用反引号(MySQL)或双引号(PostgreSQL)包住,比如
`user id`或"order date" - 示例片段(MySQL):
cursor.executemany( "INSERT INTO sales (`product`, `qty`, `date`) VALUES (%s, %s, %s)", batch_rows )
真正麻烦的从来不是“怎么点”,而是 CSV 编码不统一、首行标题缺失、NULL 值写成空字符串、时间格式五花八门——这些不会报错,但数据一进去就歪了。校验逻辑得写在脚本里,不能靠眼睛扫。










