必须点击左上角Save按钮(或Ctrl+S)并填写表名才能真正建表;仅关闭设计窗口不会保存。主键、自增、非空等勾选均对应具体DDL,类型选择需谨慎,导出SQL时注意兼容性问题。
Navicat 里点哪儿才能真正建出表,而不是卡在“设计表”界面
很多人点开 new table 后反复调整字段、保存又关闭,结果刷新数据库列表发现表根本没出现——根本原因是没点击左上角的 save 按钮(不是 ctrl+s,也不是右键菜单),而是误以为「关闭设计窗口」=「保存并建表」。
- 必须手动点顶部工具栏的
Save图标(磁盘形状)或按Ctrl+S,且弹出的对话框里填了表名才真正执行CREATE TABLE - 如果只点了右上角 × 关闭窗口,Navicat 会提示「Discard changes?」,选 Yes 就等于什么都没干
- 建表语句实际在后台执行,不显示 SQL,但可通过
Tools → Server Monitor查看最近执行的命令确认是否成功
主键、自增、非空这些关键约束,可视化勾选后到底生成什么 SQL
Navicat 的勾选框不是装饰,每个都对应明确的 DDL 行为,尤其要注意 MySQL 和 PostgreSQL 对同一选项的解释差异。
-
PK勾选 → 生成PRIMARY KEY;但若多列同时勾选 PK,Navicat 默认建复合主键(不是分别加单列主键) -
AI(Auto Increment)只对整数类型生效,且仅在 MySQL 中等价于AUTO_INCREMENT;PostgreSQL 会转成SERIAL或GENERATED BY DEFAULT AS IDENTITY -
Not Null勾选后,字段一定带NOT NULL,但默认值栏留空 ≠DEFAULT NULL(SQL 不允许),而是真的无默认值 - MySQL 8.0+ 下,如果给
VARCHAR字段设了默认值(如'-'),Navicat 会自动加上DEFAULT子句;但老版本可能静默忽略
字段类型选错导致后续写入失败的典型场景
下拉菜单里看着差不多的类型,在底层存储和校验逻辑上差很远,尤其容易在时间、文本、数字三类上翻车。
-
DATETIMEvsTIMESTAMP:前者范围大(1000–9999),后者依赖时区且范围小(1970–2038),Navicat 新建时默认选DATETIME,但业务需要自动更新时间戳就得手动换TIMESTAMP -
TEXT类型不能设默认值(MySQL 报错Invalid default value),但 Navicat 允许你在界面里填,默认值栏变灰也不报错,保存时直接失败 -
INT和BIGINT看似只是长度区别,但一旦用INT存用户 ID,后期数据超 21 亿就只能改表结构,Navicat 执行ALTER TABLE会锁表,线上慎用
从 Navicat 导出建表语句时,哪些地方常被忽略
导出 SQL 是为了复现或迁移,但 Navicat 默认导出的脚本未必能直接运行,尤其跨版本或跨引擎时。
- 导出路径是
Right-click table → Dump SQL File → Structure Only,别误点Data Only - 默认包含
IF NOT EXISTS,看起来安全,但如果目标库已存在同名表但结构不同,这条语句不会报错也不会覆盖,结果是“看似执行成功,实则没更新” - MySQL 导出的语句默认带
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4,但如果目标库是 MariaDB 10.2 以下,utf8mb4可能不被识别,需手动删掉或改成utf8 - 字段注释(Comment)会导出为
COMMENT 'xxx',但 SQLite 或旧版 SQL Server 不支持该语法,直接执行报错
建表这事,表面点几下就完,实际每一步都在悄悄决定后续能不能加字段、会不会锁表、导出脚本能用不能用。最麻烦的不是不会点,而是点了却不知道它背后替你写了哪句 SQL。










