Navicat右键“粘贴表”默认仅复制空表结构,因底层调用CREATE TABLE ... LIKE(MySQL)或未显式INCLUDING ALL(PostgreSQL),故不继承索引、外键、注释、AUTO_INCREMENT值;需手动勾选高级选项中的Foreign keys、Indexes、Copy data等才可完整克隆。
navicat 的右键“复制表 → 粘贴表”操作看似快捷,但默认行为**只复制空表结构,不带数据、不带索引名、不带外键和注释**,直接点“开始”大概率得到一个残缺表。真要克隆,得手动干预关键选项。
为什么右键粘贴后新表没有索引和外键?
Navicat 的“粘贴表”功能底层调用的是 CREATE TABLE ... LIKE(MySQL)或类似逻辑(PostgreSQL 用 CREATE TABLE ... (LIKE ...)),但默认**不启用全量继承**:
- MySQL 下
LIKE语句本身就不复制索引、外键、触发器、分区定义——它只拷列定义和基本属性 - PostgreSQL 中必须显式写
INCLUDING ALL,而 Navicat 图形界面没暴露这个开关,导出 SQL 时也常漏掉CREATE INDEX语句 - 即使源表有
COMMENT,粘贴后大概率消失;AUTO_INCREMENT值重置为 1,不是继承原值
如何让“粘贴表”真正克隆完整结构?
不能只靠右键菜单点两下。必须进入“高级选项”补全缺失项:
- 右键源表 → “复制表”,再在目标库右键 → “粘贴表”,弹出窗口后别急着点【开始】
- 点开【高级】页签,勾选:
Foreign keys、Indexes、Check constraints(PostgreSQL 还要确认Defaults和Comments) - MySQL 用户额外检查:目标库连接的
Initial statement是否设了SET NAMES utf8mb4,否则中文注释变 ? - 如果源表有自增主键,勾选
Auto-increment value,否则新表 ID 从 1 开始,后续插入可能冲突
复制后数据为空?你漏了 Copy data 选项
“粘贴表”对话框里有个极易被忽略的复选框:Copy data。它默认是**未勾选**的:
- 不勾它 → 只建空表(哪怕你点了“结构和数据”标签,这个勾选才是实际开关)
- 勾上它 → 才会执行
INSERT INTO ... SELECT *,但要注意字段顺序必须一致,否则报Column count doesn't match - 大数据量时,建议取消勾选,改用
mysqldump --no-data+--tab或 Navicat 的「数据传输」功能,更可控
拖放操作比右键粘贴更危险
虽然 Navicat 支持直接拖表到另一数据库节点,但这是最不可靠的方式:
- 不弹出任何配置窗口,完全跳过高级选项,等同于裸
LIKE+ 默认参数 - 跨服务器拖放时,字符集、引擎、排序规则极大概率丢失,
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4这类关键项不会自动补全 - 若目标库已存在同名表,拖放会静默失败或覆盖,无提示、无回滚
真正需要可靠克隆时,宁可切到 SQL 窗口手写 SHOW CREATE TABLE `src`,改名后执行,再 INSERT INTO ... SELECT —— 每一步都可见、可验、可重放。


















