必须在create table中一次性声明identity(1,1)和primary key,整数类型且不可冗余not null;navicat界面勾选不等于生效,须查sys.identity_columns确认;已有表无法直接添加identity,需重建列。
建表时必须显式声明 identity 和 primary key
navicat 图形界面勾选“主键”+“自动递增”,不等于 sql server 真的建出了 identity 列。它只是生成 ui 状态,底层是否生效取决于最终执行的 ddl 是否含 identity(1,1) 且该列被 primary key 显式约束。
常见错误现象:表设计页显示 ✔ Auto Increment,但插入数据时报 Cannot insert explicit value for identity column,或查 sys.identity_columns 返回空——说明根本没建成功。
- 必须用整数类型:
TINYINT、SMALLINT、INT或BIGINT;DECIMAL、NUMERIC、VARCHAR不支持IDENTITY - 建表语句里不能写冗余
NOT NULL——IDENTITY列天然非空,加了反而干扰 Navicat 解析逻辑 - 必须在
CREATE TABLE里一次性声明:id INT IDENTITY(1,1) PRIMARY KEY;后续用ALTER TABLE ... ADD CONSTRAINT补主键,Navicat 不认
已有表想加标识字段?不能直接 ALTER COLUMN
SQL Server 不允许对已有列直接添加 IDENTITY 属性。Navicat 在已有表的设计页里勾选“标识”再保存,大概率会静默失败,或删掉原列重建(清空数据)。
正确做法是重建列,而非修改:
- 新增一个临时列:
ALTER TABLE users ADD id_new INT IDENTITY(1,1); - 把旧主键值复制过去(若需保留):
UPDATE users SET id_new = id; - 删旧列、重命名新列:
ALTER TABLE users DROP COLUMN id; EXEC sp_rename 'users.id_new', 'id', 'COLUMN'; - 最后加主键:
ALTER TABLE users ADD CONSTRAINT PK_users PRIMARY KEY (id);
注意:整个过程需关闭 SET IDENTITY_INSERT users ON 才能写入旧值,操作前务必备份。
Navicat 连接配置影响 IDENTITY 生效与否
老版本 Navicat(如 15.0.26 之前)在某些驱动下,会退化为用触发器模拟自增,导致生成的表结构里根本没有 IDENTITY 属性——你看到的“自动递增”只是假象。
验证方式很简单:
- 建完表立刻执行:
SELECT * FROM sys.identity_columns WHERE object_id = OBJECT_ID('users');,有记录才真生效 - 连接配置中启用 “Use SQL Server Native Client” 或明确指定 “ODBC Driver 17 for SQL Server”
- 避免使用过时的 SQLOLEDB 或 SQLNCLI 驱动,它们对
IDENTITY元数据识别不稳定
Navicat 缓存导致“自增标识”显示错乱
重置 IDENTITY 种子(如用 DBCC CHECKIDENT('users', RESEED, 100))后,Navicat 表设计页可能仍显示旧的起始值,甚至“自增”图标消失。
这不是数据问题,而是 Navicat 缓存了建表时的元数据,不会主动刷新。
- 手动刷新连接:右键连接 → “刷新”(不是刷新表,是刷新整个连接)
- 或断开重连,强制重新读取
sys.identity_columns和sys.columns.is_identity - 别依赖界面图标判断,以
SELECT COLUMNPROPERTY(OBJECT_ID('users'), 'id', 'IsIdentity')返回 1 为准
真正麻烦的不是怎么设,而是设完之后没人去验证它到底有没有进系统视图——多数问题都卡在这一步。











