正向工程默认删表重建,不可用于生产;应改用结构同步,禁用删除与清空选项,仅比对结构生成ALTER语句,并在测试库验证、生产环境预执行加回滚预案。

正向工程不是数据同步,它默认会删表重建
Navicat 的「正向工程(Forward Engineering)」本质是把 ER 图模型转成 SQL 并执行建库建表语句,Drop Table If Exists 和 CREATE TABLE 是它的默认行为。它不比较现有数据,也不管目标库里有没有正在跑的业务数据——只要模型里有这张表,它就打算清掉重来。所以你不能指望它“智能跳过已有数据”,必须从流程上切断这个危险路径。
用结构同步替代正向工程,禁用删除与清空选项
真正可控的做法是改用「结构同步(Structure Synchronization)」,它支持精细控制变更动作,且不会碰数据:
- 入口:菜单【Tools】→【Structure Synchronization】,源选你的 ER 模型导出的 SQL 文件(或本地测试库),目标选生产库连接
- 在 Options 页面,**务必取消勾选**:
Delete objects in the target that do not exist in the source(删目标中不存在的对象)、Truncate tables before importing(清空目标表) - 勾选
Compare structure only(仅比对结构),这样预览时只显示 ALTER 语句,不会出现 DROP 或 TRUNCATE - 预览 SQL 中若看到
ALTER TABLE ... ADD COLUMN或MODIFY COLUMN,说明安全;若出现DROP TABLE或CREATE TABLE,立刻返回检查选项
手动验证 ALTER 兼容性,尤其涉及 NOT NULL / DEFAULT / 外键
即使结构同步只生成 ALTER,也未必能直接上线。MySQL 对某些字段变更会隐式锁表或失败:
-
ADD COLUMN在 MySQL 5.6+ 通常是 Online DDL,但加NOT NULL且无默认值会全表重建 -
MODIFY COLUMN改类型(如VARCHAR(50)→VARCHAR(20))可能因数据超长被拒绝 - 外键新增/删除需确保引用表存在、字符集一致,否则报错
ERROR 1005 (HY000) - 建议先在测试库跑一遍同步预览生成的 SQL,用
EXPLAIN FORMAT=TRADITIONAL ALTER TABLE ...(MySQL 8.0.23+)看是否触发 copy
生产环境必须走「预执行 + 事务包裹 + 回滚预案」三步
结构同步本身不开启事务,而线上 ALTER 可能耗时很久。别信“预览没报错就等于安全”:
- 在同步前,手动连上生产库,执行
BEGIN;开启事务(注意:MySQL 的 DDL 语句会自动提交,所以只能对部分操作生效,比如先 SELECT 校验、再分批 UPDATE 默认值) - 把结构同步生成的 SQL 复制出来,在 SQL 编辑器里粘贴,逐条加注释并手动加
/* backup: SHOW CREATE TABLE xxx; */等快照指令 - 对高风险表(如订单主表),先用
SELECT COUNT(*)和SELECT MAX(id)记录基线,同步后立刻校验行数与主键范围是否突变
关键点在于:正向工程和结构同步是两类工具,前者是开发建模阶段用的,后者才是生产运维该用的。很多人误把模型当权威,却忘了生产库的数据状态永远比模型更真实。

















