Navicat中勾选PK和AI后未生效,主因是未点击保存按钮(或Ctrl+S),所有设置仅为本地草稿;必须先设PK再设AI、字段须为整数类型、无NULL及重复值,否则静默失败或报错。

Navicat 17 保存按钮没点,操作就白做了
Navicat 表设计器里勾选了 PK 和 A_I,但执行 INSERT 仍报 Duplicate entry '0' for key 'PRIMARY' 或根本没自增——大概率是只改了界面标记,没点右上角的 保存(磁盘图标)或按 Ctrl+S。Navicat 不会自动提交 DDL,所有改动都只是本地草稿。底部状态栏显示 Unsaved changes 就是明确提醒。不保存,SELECT * FROM information_schema.KEY_COLUMN_USAGE 查不到主键,SHOW CREATE TABLE 也看不到 AUTO_INCREMENT。
已有数据的表加自增主键,必须分两步且顺序不能错
直接对已有字段勾选 A_I 并保存,Navicat 会尝试执行类似 ALTER TABLE t MODIFY id INT AUTO_INCREMENT 的语句,但几乎必失败。MySQL 要求 AUTO_INCREMENT 字段必须是索引的一部分,而修改语句本身不会自动补主键约束。
- 先确保该字段值全部非空、无重复(否则保存时会静默跳过或报
ERROR 1062) - 在 Navicat 设计器中,先选中字段 → 勾选
PK→ 保存(这步生成ADD PRIMARY KEY) - 再选中同一字段 → 勾选
A_I→ 保存(这步生成MODIFY ... AUTO_INCREMENT) - 如果原字段是
INT UNSIGNED,第二步保存时必须保持类型一致,否则触发ERROR 1067: Invalid default value for 'id'
字段类型和 NULL 值是静默失败的根源
Navicat 对不合规操作往往不报错,而是跳过或部分生效。常见静默陷阱:
-
VARCHAR、TEXT或DECIMAL字段,A_I复选框直接灰显不可用——不是 Bug,是 MySQL 层面禁止 - 字段含
NULL值却勾了PK:保存时可能无提示,但后续ALTER TABLE实际执行会因唯一性约束失败 - 字段值有重复,Navicat 可能允许你勾选
PK,但保存瞬间报ERROR: could not create unique index - MySQL 严格模式下,插入
0到NOT NULL自增列会被拒绝,这不是自增失效,而是你手动传了0
PostgreSQL 和 SQL Server 的“自增”不是一回事
Navicat 界面统一叫 A_I,但底层机制完全不同,误用会导致编辑报错或插入失败:
- PostgreSQL:勾选
A_I默认生成SERIAL(即INTEGER+ 序列 + 默认值),不是标准GENERATED BY DEFAULT AS IDENTITY;若已建IDENTITY列,Navicat 编辑数据时往该列填值会直接报cannot insert into column "id" because it is a generated column - SQL Server:“主键”和“标识”是两个独立开关,必须同时勾选;已有列无法直接加
IDENTITY,Navicat 保存时会提示错误而非静默忽略 - 所有数据库类型下,
A_I生效的前提都是:字段已设为PK(或UNIQUE索引的一部分)、类型为整数、无NULL或重复值
实际操作中最容易被忽略的,是字段当前数据状态与 MySQL 强约束之间的冲突——Navicat 图形界面不会提前校验,它只负责把你的勾选翻译成 DDL,而 DDL 执行失败时,错误信息常被 UI 吞掉或仅在日志里一闪而过。


















