是,Navicat默认备份数据库时对无主键表仅导出结构、跳过数据且不提示;应改用“Export Data”流程并勾选“Export data”,选择INSERT模式,同时注意DEFINER和字符集问题。
Navicat 备份无主键表时会静默跳过数据?
默认情况下,navicat 的「备份数据库」功能对无主键表(即没有 primary key 或 unique not null 索引的表)会只导出结构、跳过数据行,且不报错、不提示。这不是 bug,而是其内部逻辑判断:它依赖主键/唯一索引来保证行级可识别性,否则认为“不适合做完整逻辑备份”。你看到的 sql 文件里只有 create table,没有 insert,就是这个原因。
改用「导出数据」而非「备份数据库」
绕过该限制最直接的方式是不用 Backup Database 功能,改走 Export Data 流程——它不校验主键,只要表可读就能导出全部行。
- 右键目标数据库 → 选择
Export Data(不是 Backup) - 在弹窗中目标类型选
SQL File(不是 Excel/CSV) - 勾选你要导出的无主键表(支持多选)
- 在
Options标签页中确认:Export data已启用、Export structure按需勾选 - 关键设置:
Insert statement模式必须选INSERT(勿选REPLACE或INSERT IGNORE,后者可能因缺失主键而失效)
导出后 SQL 文件还原时要注意 DEFINER 和字符集
无主键表导出的 SQL 虽能生成 INSERT,但还原时仍可能失败,常见于两个隐性坑:
-
DEFINER子句:如果原表含触发器或视图,导出 SQL 可能带DEFINER=`user`@`%`,而目标库没该用户 → 还原报错。解决方法:导出前在Export Data → Options → Advanced中勾选Remove DEFINER and SQL SECURITY - 字符集不一致:源库用
utf8mb4,目标库默认latin1→ 插入中文变乱码。导出时在Options → Character set显式选utf8mb4,还原前在目标库执行SET NAMES utf8mb4
批量处理多个无主键表的实用技巧
如果你有几十张无主键表要统一导出,手动勾选效率低,容易漏:
- 先用 SQL 查出所有无主键表:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_db' AND table_name NOT IN (SELECT table_name FROM information_schema.key_column_usage WHERE constraint_name = 'PRIMARY KEY' AND table_schema = 'your_db'); - 把结果复制进文本编辑器,整理成一行逗号分隔的表名列表
- 回到 Navicat 的
Export Data → Objects页面,点「Select All」再取消全选,然后用 Ctrl+V 粘贴表名(Navicat 支持按名称模糊匹配并自动勾选) - 导出前务必检查左下角显示的「Selected objects count」是否与你预期一致
无主键表本身就不适合长期在线业务,备份只是兜底手段;真正要解决的,是推动补建主键或至少加一个 UNIQUE NOT NULL 索引——否则连 mysqldump --skip-triggers 都会同样跳过数据。


















