最可靠方式是「工具→数据传输」:支持跨库跨服务器、可控制清空目标表和自增id,且能处理结构与数据一体化复制,避免右键复制仅限同连接的限制及导出sql易漏约束、字符集等问题。
用“数据传输”功能最可靠
navicat 里真正能跨库、可控、带结构+数据一起复制的,只有「工具 → 数据传输」。它不依赖右键菜单的模糊操作,也不受连接范围限制,连 postgresql 和 mysql 之间都能传(只要目标支持对应类型)。
常见错误是误以为右键「复制表」→「结构和数据」就能跨库生效——实际上 Navicat 17+ 的右键复制只在**同一连接、同一数据库内**起作用,跨 schema 或跨连接时直接失败或静默丢弃。
- 先确保源库和目标库都已成功连接(且目标库存在,字符集建议提前设为 utf8mb4)
- 顶部菜单 →「工具」→「数据传输」→ 左侧选源表,右侧选目标库(可跨服务器)
- 点击「高级」→ 必须勾选:
Truncate target table before transfer(否则重复执行会报Duplicate entry) - 如目标表主键是自增,还需勾选:
Auto-increment value,否则新数据 ID 从 1 开始冲突 - 大数据量(>50 万行)时,建议关闭「实时显示进度」,避免 UI 卡死影响底层传输
MySQL 用 Duplicate Table 勾选“复制数据”也行,但有锁表风险
如果只是同库复制,Duplicate Table(右键 →「重复表」)是最快捷的方式,勾上「复制数据」即可一步到位。
但它底层执行的是 CREATE TABLE ... AS SELECT 或分步建表+插入,取决于引擎和数据量。InnoDB 表超过 10 万行时,原表会被加读锁——不影响 INSERT/UPDATE,但可能拖慢长查询或导致慢日志飙升。
- 外键约束会被复制,但不会校验被引用表是否存在;目标库缺关联表时,建表直接失败,报错
ERROR 1215: Cannot add foreign key constraint - 隐藏字段(invisible column)和生成列(
GENERATED COLUMN)在 Navicat ≥16.0 才能正确识别,旧版本可能漏掉 - 默认不继承触发器、存储过程、事件,这些得手动补
PostgreSQL 别信右键“复制”,老实用 CREATE TABLE ... AS SELECT 或 CREATE TABLE ... LIKE ... INCLUDING ALL
Navicat 对 PostgreSQL 的右键菜单基本没提供真正可用的“结构+数据”一键复制入口。点「复制」实际走的是剪贴板表名传递,粘贴仅限当前连接内同库,且只建空表(无索引、无约束、无注释)。
想一步到位,得写 SQL:
- 只复制结构(含索引、约束、默认值):
CREATE TABLE new_table (LIKE old_table INCLUDING ALL)—— 注意必须写INCLUDING ALL,否则只复制列定义 - 结构+数据一起复制:
CREATE TABLE new_table AS SELECT * FROM old_table—— 但会丢失NOT NULL、默认值、约束、索引;建议显式列出字段:SELECT id, name, created_at FROM old_table - 大数据量时,
CREATE TABLE AS比COPY慢,且事务内锁源表时间更长;生产环境建议改用pg_dump -s -t table | pg_restore或 Navicat 的「数据同步」工具
导出 SQL 文件再执行?小心隐性丢东西
右键 →「转储 SQL 文件」→ 勾选 Structure and Data,看似省事,但生成的 SQL 很容易漏关键项:比如外键顺序错乱(先建子表再建父表)、索引缺失、字符集没显式声明、自定义类型没包含。
尤其当表用了分区、继承、或 GENERATED COLUMN,Navicat 导出的 SQL 几乎必然不全。你得手动检查并补全:
- 确认每张表的
CREATE TABLE后紧跟CREATE INDEX和ALTER TABLE ADD CONSTRAINT - 检查是否有跨 schema 引用,比如
REFERENCES public.users写成REFERENCES users,执行时报relation "users" does not exist - 如果源表用了
CREATE TYPE,导出 SQL 不含类型定义,需单独执行一遍
真正需要稳定复刻的场景,别图快——花两分钟打开「数据传输」或写条带 INCLUDING ALL 的 SQL,比事后 debug 半小时强得多。











