最省事的是“重复表”功能,仅限同库:右键选「重复表」可一键复制结构(含索引、自增起始值、字符集、注释)且不带数据;跨库必须手动改写SHOW CREATE TABLE语句。
用“重复表”功能最省事,但只限同库
navicat 里真正能一键复制结构(含索引、自增起始值、字符集、注释)且不带数据的操作,是右键表名后选「重复表」(duplicate table),不是「复制」或「导出」。它默认不勾选“复制数据”,执行后新建的表和原表结构完全一致。
常见错误:误点「Copy Table」或「复制」菜单项——前者会强制进入跨连接流程,后者只是复制表名到剪贴板,粘贴时仅在**同一连接、同一数据库内**生效,跨库直接失败或按钮变灰。
- 目标表名必须手动输入,不能留空;自动加
_copy后缀只是界面提示,实际不生效 - 外键约束会被复制,但不会检查引用表是否存在;若目标库缺被引用表,建表时报
ERROR 1215: Cannot add foreign key constraint - MySQL 8.0+ 的生成列(
GENERATED COLUMN)、隐藏字段(INVISIBLE)能保留,但 Navicat ≤15.0 版本可能显示为空白,建议升级到 16.0+
跨库复制结构必须用 SHOW CREATE TABLE 手动改名
想把表结构从 prod_db.users 复制到 test_db.users_backup?右键菜单全都不行。可靠做法是:
在源表上右键 →「对象信息」→ 切到「DDL」页签 → 复制整个 CREATE TABLE 语句 → 粘贴到目标数据库的查询窗口 → 把 `prod_db`.`users` 替换成 `test_db`.`users_backup` → 执行。
- 必须保留反引号,否则含特殊字符或关键字的表名会报错
- 检查语句是否含
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;若缺失,说明源库连接未设对字符集 -
COMMENT、COLLATE、分区定义、生成列等细节只有这个方式能完整保留
“数据传输”工具可跨服务器,但默认不传索引和外键
顶部菜单 →「工具」→「数据传输」→ 左选源表,右选目标数据库 → 点「高级」→ 取消勾选 Transfer data → 勾选 Drop target table if exists → 开始。
这比导出 SQL 文件快,支持跨服务器,但有硬伤:
- 默认不复制索引、外键、触发器、全文索引——得额外在「高级」里手动勾选
Export indexes、Export foreign keys等 - PostgreSQL 下更麻烦:
INCLUDING ALL必须显式写进 SQL,Navicat GUI 不自动补 - MySQL 的
CREATE TABLE ... LIKE语法不支持跨库,而 Navicat 的图形化操作底层仍依赖它,所以跨库时必然绕不开手动 DDL
别信“转储 SQL 文件 → Structure only”能一步到位
右键 →「转储 SQL 文件」→ 勾选 Structure only,看似简单,实则埋雷最多:
- 生成的 SQL 常漏掉
ENGINE和DEFAULT CHARSET,尤其当源库连接没设SET NAMES utf8mb4时 - 外键、索引语句被拆到文件末尾,执行顺序错乱(比如先建子表再建父表),导致
ERROR 1005 - 双击 SQL 文件导入?危险!Navicat 默认设置为“遇到错误继续执行”,
ERROR 1050 (42S01): Table 'xxx' already exists这类关键错误会被吞掉,你根本不知道哪张表没建成功
真正可控的做法:导出后打开 SQL 文件,逐行检查 CREATE TABLE 是否完整,删掉无用的 USE db_name;,再粘贴到目标库查询窗口手动执行。











