SQL Server 的 IDENTITY 属性仅支持 TINYINT、SMALLINT、INT、BIGINT 四种整数类型,且字段必须为 NOT NULL;不支持直接修改已有列添加该属性,需新建表或新增列实现;插入时若显式指定 ID 值则绕过自增机制,导致主键冲突;IDENTITY 本身不保证值连续,跳号属正常设计行为。
Navicat 表设计器里勾选“标识”后不生效?先看字段类型
sql server 的 identity 属性只支持整数类型: tinyint、smallint、int、bigint。如果你在 navicat 表设计器中给 varchar、decimal 或 datetime 字段勾选了“标识”(或标为 a_i),该选项会变灰不可用,或保存时直接报错 invalid auto increment column。
必须确保:
- 字段类型是上述四种整数之一
- 未勾选“允许空值”(即已设为 NOT NULL)
- 若已有数据,该字段所有值必须非空、唯一,且不能含负数或超出目标类型的范围(例如用 TINYINT 却存了 300)
修改已有表时,“标识”复选框是灰色的?你正试图直接改列属性
SQL Server 不允许对已有列直接添加 IDENTITY 属性——这是引擎级限制,不是 Navicat 的 bug。你在设计器里看到“标识”变灰,是因为 Navicat 检测到该列已存在且非空,底层 ALTER TABLE ... ALTER COLUMN 语法根本不支持追加 IDENTITY。
可行路径只有两条:
- 新建表方式:导出原表结构 → 手动在 CREATE TABLE 语句中加入 [id] INT IDENTITY(1,1) PRIMARY KEY → 执行建表 → 用 INSERT INTO new_table (col1, col2) SELECT col1, col2 FROM old_table 迁移数据
- SQL 命令方式:执行 ALTER TABLE table_name ADD id_new INT IDENTITY(1,1) PRIMARY KEY(新增一列),再删旧主键列(需先删依赖约束)
保存后 INSERT 仍报主键冲突?你显式传了 ID 值
Navicat 设置好 IDENTITY 后,SQL Server 只在以下任一情况触发自增:
- 插入语句中完全不提该字段:INSERT INTO users (name, email) VALUES ('Alice', 'a@b.c')
- 显式传 NULL:INSERT INTO users (id, name) VALUES (NULL, 'Bob')
但如果你写了 INSERT INTO users (id, name) VALUES (100, 'Charlie'),SQL Server 会照单全收,哪怕 100 已存在,就会报 Cannot insert duplicate key。这不是自增失效,是你绕过了它。
特别注意:
- 0 在严格模式下不被视作“未提供”,可能被拒绝(尤其字段定义为 NOT NULL 且无默认值)
- 外键引用该表时,若子表插入用了硬编码 ID,上线后极易因自增逻辑变化而断裂
IDENTITY 值跳号或不连续?这不是错误,是设计使然
SQL Server 的 IDENTITY 不保证连续性。以下情况都会导致跳号:
- 事务回滚(已分配的值作废)
- 手动 SET IDENTITY_INSERT ON 后插入了指定值
- 服务重启或故障恢复(缓存的标识值丢失)
- 并发高时多个会话预分配批次
如果你的应用逻辑依赖“ID 连续”(比如用 ID 做分页序号或报表编号),必须放弃 IDENTITY,改用 SEQUENCE 配合 NOCACHE,或由应用层维护独立计数器。Navicat 设计器里填的种子和增量只是起点,管不了后续是否连贯。


















