Navicat 本身不支持“合并分支”的建表脚本,它不是版本控制系统,无法自动合并 Git 分支中的 DDL 差异;正确做法是先在 Git 中完成分支合并并人工解决冲突,再用 Navicat 执行最终脚本,或借助其“结构同步”功能对比已落地的数据库/SQL 文件。
Navicat 本身不支持“合并分支”的建表脚本
navicat 是数据库客户端工具,不是版本控制系统,它没有 git 那样的分支管理或自动合并能力。所谓“合并多个分支的建表脚本”,实际是指:你手头有多个 git 分支(比如 dev、feature/user-auth、release/2.3),每个分支下各自修改了建表语句(如 create table 或 alter table),现在想把它们整合成一份可执行的、无冲突的 sql 脚本。navicat 只能帮你执行或对比 sql,不能代替 git 做逻辑合并。
正确做法:先在 Git 中完成分支合并,再用 Navicat 执行结果脚本
建表结构变更属于 DDL,容易产生冲突(比如两个分支都改了同一张表的 email 字段类型),必须人工判断取舍。Navicat 的 SQL 文件 功能或 查询窗口 只适合执行,不适合决策。
- 在命令行或 IDE 中,先
git checkout到目标分支(如main) - 用
git merge feature/user-auth合并,解决冲突(尤其注意.sql文件里的CREATE TABLE和ALTER TABLE语句) - 确认合并后,从 Git 仓库中提取最终版建表脚本(比如
sql/migrations/202405_create_users.sql) - 在 Navicat 中右键目标数据库 →
运行 SQL 文件,选择该文件执行
如果只是想对比不同分支的建表差异,用 Navicat 的“结构同步”功能
这个功能本质是比对两个数据库(或数据库+SQL 文件)的表结构差异,生成同步脚本。但它不能识别 Git 分支,你需要先把各分支的建表结果落地为真实数据库或本地 SQL 文件。
- 方法一:分别在本地启动两个 MySQL 实例(或不同 schema),导入各分支的建表脚本,再用 Navicat 的
结构同步对比它们 - 方法二:把分支 A 的建表脚本保存为
a.sql,分支 B 的保存为b.sql,然后用 Navicat 的文件 → 比较 SQL 文件(需 Navicat Premium 16+)粗略查看文本差异 - 注意:
结构同步生成的脚本默认含DROP和ADD,生产环境务必检查是否符合预期,避免误删字段
常见踩坑点:直接拼接 SQL 文件导致语法错误
有人会把多个 CREATE TABLE 脚本简单复制粘贴到一个文件里执行,结果报错:
-
ERROR 1050 (42S01): Table 'users' already exists—— 因为重复建表,没加IF NOT EXISTS -
ERROR 1060 (42S21): Duplicate column name 'updated_at'—— 多个ALTER TABLE都加了同字段 - 脚本里混用了不同 MySQL 版本语法(如
JSON类型在 5.7+ 才支持),而目标库是 5.6
真正安全的做法是:以主干分支为准,只追加新增表/字段的语句,并确保每条 CREATE 或 ALTER 都带条件判断或幂等逻辑。Navicat 不会帮你做这件事,它只忠实地执行你给它的 SQL。











