结构同步是最稳妥的空表结构复制方式,因其可控性强、不丢外键/注释/分区等细节,且支持批量校验与预览SQL,避免右键复制表导致的漏项、覆盖失败和权限问题。
Navicat 17 里做大型生产库的空表结构复制,**结构同步(Structure Synchronization)是最稳妥的选择**,比右键“复制表”或“转储 SQL 文件”更可控、更少丢细节。
为什么不用右键「复制表」功能
这个功能默认只复制单张表结构,且不保证以下关键项:外键约束、check 约束、字段注释、自增起始值、生成列(generated column)、json 字段校验、分区定义。对大型库批量操作时,还得一张张点,效率低还容易漏。更麻烦的是,它不会校验目标库是否已有同名对象——error 1050 (42s01): table 'xxx' already exists 错误直接被跳过,你以为成功了,其实啥都没建。
结构同步前必须确认的三件事
- 源库和目标库连接都已测试通过,且目标库用户有
CREATE、ALTER、SHOW VIEW权限(不需要INSERT或DROP) - 目标库字符集与源库一致,推荐统一为
utf8mb4;若不一致,同步后COMMENT或枚举值可能乱码 - 关闭 Navicat 的「自动提交事务」(设置 → 常规 → 取消勾选「Auto-commit transaction」),否则单个建表失败会导致整批中断
结构同步中如何确保只复制结构、不碰数据
打开顶部菜单「工具」→「结构同步」,按顺序操作:
- 左侧选源库(生产库),右侧选目标库(空库或测试库)
- 点击「下一步」→「比较」,等待完成(大库可能需几十秒)
- 在差异列表页,**取消勾选所有「Data」类对象**(如「Table Data」「View Data」),只保留「Table」「Index」「Foreign Key」「Check Constraint」等结构项
- 点击「设置」→「高级」→ 确保「Drop objects not exist in source」未勾选(避免误删目标库已有但源库没有的表)
- 重点看「预览」里的 SQL 脚本:确认每条语句都是
CREATE TABLE ... LIKE或完整CREATE TABLE,不含INSERT;若有INSERT,说明你上一步没清干净「Data」选项
同步完成后最容易忽略的五个细节
同步看似完成,但这些地方常出问题:
-
AUTO_INCREMENT值不会继承——新表主键从 1 开始,如果后续要导入数据,得手动ALTER TABLE xxx AUTO_INCREMENT = N - 视图(
VIEW)依赖的函数或表若在目标库不存在,同步会失败,但 Navicat 默认跳过,得查日志 - 分区表(
PARTITION BY)在 MySQL 8.0+ 才完全支持,老版本 Navicat 17 可能降级为普通表,需人工核对SHOW CREATE TABLE - 字段
COMMENT有时被截断(尤其含 emoji 或多字节符号),建议导出后用文本比对 - 目标库若开了
sql_mode=STRICT_TRANS_TABLES,而源库没开,某些默认值(如datetime NOT NULL无默认)会报错,需提前统一
SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'xxx' 对比张数,再抽 3–5 张表跑 SHOW CREATE TABLE 逐行比对。大库容不得“差不多”。


















