Navicat结构同步默认不删除目标库字段,即使勾选“Drop objects not exist in source”也仅作用于表等一级对象;删字段必须通过“设计表”→选中字段→Delete键→SQL预览确认→执行,且须手动检查索引、外键、默认约束等依赖。
Navicat结构同步默认不删目标库字段,必须手动干预
navicat 的「结构同步」不是单向覆盖工具,它默认只新增或修改字段,绝不会自动 drop column —— 即使你勾选了 drop objects not exist in source,这个选项也只作用于表、视图、存储过程等一级对象,**字段(column)不在其删除范围内**。这是设计如此,不是 bug。常见现象是:源库已删掉 tmp_flag 字段,目标库仍保留,同步预览里完全不出现 alter table ... drop column 语句。
真正能删字段的唯一可靠方式:用“设计表”界面 + SQL 预览
图形化操作本身不危险,危险在于跳过校验直接点保存。关键动作链必须闭环:
- 右键目标表 → “设计表”(不是“打开表”)
- 选中要删的字段整行 → 按
Delete键(键盘 Delete,不是 Backspace) - 务必点击工具栏的
SQL 预览按钮,确认生成的是ALTER TABLE `t` DROP COLUMN `xxx`,而非MODIFY COLUMN或其他误操作 - 勾选
执行后刷新表结构,否则界面可能残留已删字段的缓存显示
注意:SQL 预览 是唯一能提前看到 Navicat 底层执行语句的地方,跳过它等于闭眼开车。
删字段前必须查清三类依赖,Navicat 不会提醒
Navicat 的“设计表”界面右侧字段属性栏对依赖项完全静默——索引、外键、默认约束、计算列、视图引用,它一个都不标红也不警告。你点保存,MySQL/SQL Server 直接报错中断,且不回滚已执行部分。
删之前手动查清:
-
SHOW INDEX FROM `table_name` WHERE Column_name = 'xxx'→ 有结果就得先DROP INDEX -
SELECT CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME='table_name' AND COLUMN_NAME='xxx'→ 外键名拿到后执行ALTER TABLE ... DROP FOREIGN KEY `name` -
SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME='table_name' AND COLUMN_NAME='xxx' AND EXTRA LIKE '%default%'→ 若字段带默认约束(尤其 SQL Server 的DF_前缀),得先ALTER TABLE ... DROP CONSTRAINT
PostgreSQL 和 MySQL 8.0+ 还要额外检查是否被 GENERATED ALWAYS AS 计算列引用,这类依赖 information_schema 不暴露,得查 pg_get_expr() 或 SHOW CREATE TABLE。
批量删字段只能写 SQL,Navicat 图形界面不支持
想一次删 col_a、col_b、col_c?“设计表”里只能删一个、点一次保存、再删一个……中间出错就得重来。这时候必须切到查询窗口手写:
MySQL(支持多字段):ALTER TABLE users DROP COLUMN col_a, DROP COLUMN col_b, DROP COLUMN col_c;
SQL Server(2016+ 支持,但 Navicat 旧版本生成脚本仍按单条):ALTER TABLE users DROP COLUMN col_a; ALTER TABLE users DROP COLUMN col_b;
PostgreSQL(必须分多条):ALTER TABLE users DROP COLUMN col_a; ALTER TABLE users DROP COLUMN col_b;
别信 Navicat 自动生成的“批量”脚本——它大概率拆成单条,且不处理依赖顺序。真正省事的做法:把依赖清理语句和删字段语句一起写进一个事务块,手动执行。


















