MySQL要求自增列必须是主键或唯一索引的一部分,且须先设PK再勾AI,顺序颠倒则保存失败;PostgreSQL中SERIAL仅为快捷方式,IDENTITY才是标准;SQL Server的标识列与主键独立,现有列无法直接添加IDENTITY。
MySQL:必须先主键再自增,顺序反了保存失败
navicat 图形界面里勾选 pk 和 ai 看似一步到位,但 mysql 强制要求:自增列必须是主键(或至少是唯一索引的一部分),且必须先设为 pk,再勾 ai。顺序颠倒会导致点击「保存」时无反应或静默失败。
- 字段类型只能是整数类:
TINYINT、INT、BIGINT(推荐INT UNSIGNED,避免负值干扰) - 已有数据的表加自增主键,需确保该列值唯一、非空、无
NULL;否则保存时报ERROR 1062: Duplicate entry或ERROR 1138: Invalid use of NULL value - Navicat 不会自动补索引——如果原字段没主键也没索引,直接勾
AI会触发ERROR 1075: Incorrect table definition - 修改后务必点右上角「保存」按钮(磁盘图标),不是关闭窗口;状态栏显示
Unsaved changes就说明还没提交
PostgreSQL:SERIAL 是快捷方式,IDENTITY 才是标准解
Navicat 的 Auto Increment 开关在 PostgreSQL 里不对应真实语法,它只是 UI 映射:选 SERIAL 类型 → 自动生成序列 + DEFAULT nextval('xxx');选 INTEGER + GENERATED BY DEFAULT AS IDENTITY → 真正的 SQL 标准 identity 列。
- 新建表时,字段类型下拉选
SERIAL(等价于INTEGER+ 隐式序列),AI选项才会可用;若已用INTEGER建好列,AI会灰掉不可勾 - 已存在普通
INTEGER列无法通过图形界面“升级”为 identity,必须切到「查询」窗口手写:ALTER TABLE t ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY - Navicat 16+ 能识别并编辑 identity 列,旧版(如 15 及以下)可能在数据编辑页把该列置灰,或插入时报
ERROR: cannot insert into column "id" because it is a generated column - 导出 SQL 时注意勾选
Include AUTO_INCREMENT value,否则重建表时自增值从 1 重新开始
SQL Server:标识列(identity)和主键是两件事
SQL Server 没有 AUTO_INCREMENT,只有 IDENTITY(seed, increment) 属性。Navicat 里「主键」和「标识」是两个独立开关,只勾 PK 不勾 Identity,插入时不会自增。
- 字段类型必须是整数类:
TINYINT、SMALLINT、INT、BIGINT;非数字类型点不了「标识」选项 - 已有表想加标识列,Navicat 无法直接修改——SQL Server 不允许对现有列添加
IDENTITY。得先导出数据 → 新建带IDENTITY(1,1)的表 → 导入 → 删除旧表 - 如果表已有主键字段,再点「标识」仍失败,大概率是主键约束已绑定,需先删主键、重建字段、再同时勾
PK和Identity,最后保存 - 插入时若显式指定
id值(如INSERT INTO t (id, name) VALUES (100, 'x')),需先执行SET IDENTITY_INSERT t ON,否则报主键冲突
跨数据库共性陷阱:数据干净度和保存动作常被忽略
无论哪种数据库,Navicat 的「设计表」界面都只是生成 DDL 的草稿板,真正生效靠的是你按下「保存」那一刻发出的 ALTER TABLE 或 CREATE TABLE 语句。而最容易卡住的,往往是数据层面的隐性约束。
- 主键列含
NULL?执行前先查:SELECT COUNT(*) FROM table WHERE id IS NULL - 被外键引用?Navicat 不提示依赖关系,报错
Cannot add or update a child row: a foreign key constraint fails时,得手动查pg_constraint(PG)或INFORMATION_SCHEMA.KEY_COLUMN_USAGE(MySQL/SQL Server) - 字段类型不匹配却强行勾
AI?比如给VARCHAR列点自增,Navicat 不拦,但 MySQL 建表直接报ERROR 1067,SQL Server 根本不显示「标识」选项 - 改完不保存就去测试插入?Navicat 底部状态栏没变回「Ready」,说明 DDL 还没发出去
SHOW CREATE TABLE table_name(MySQL)、\d table_name(PG)或 sp_help table_name(SQL Server),确认输出里真有 AUTO_INCREMENT、GENERATED BY DEFAULT AS IDENTITY 或 IDENTITY(1,1) —— 界面上的小钥匙和对勾,不代表数据库真的认。


















