LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值

liguoquan
2025年10月9日 15:22 本文热度 66
:当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值


问题说明

当你尝试向一个包含 IDENTITY(标识)列的 SQL Server 表插入显式值时,若会话或表的 IDENTITY_INSERT 设置为 OFF,会收到类似错误:

错误信息(示例):

"Cannot insert explicit value for identity column in table 'YourTable' when IDENTITY_INSERT is set to OFF."

这表示 SQL Server 不允许在插入语句中为标识列(自动生成的列,如自增主键)指定值,除非你临时启用了 IDENTITY_INSERT。

解决方案一:不要为标识列提供值(推荐)

最简单也是最安全的做法是从 INSERT 语句中省略该标识列,让数据库自动生成值:

sql

-- 假设表结构:Id (IDENTITY), Name, Age

INSERT INTO YourTable (Name, Age)

VALUES ('Alice', 30);

优点:避免手动管理主键值,防止冲突或重复。

适用场景:正常插入新记录,使用数据库自增值。

解决方案二:临时启用 IDENTITY_INSERT(仅当必须插入显式标识值时)

如果你确实需要插入特定的标识值(例如数据迁移、还原或保持原有 ID),可以在操作时启用 IDENTITY_INSERT:

sql

-- 允许向 YourTable 的标识列插入显式值

SET IDENTITY_INSERT YourSchema.YourTable ON;


INSERT INTO YourSchema.YourTable (Id, Name, Age)

VALUES (1001, 'Bob', 45);


SET IDENTITY_INSERT YourSchema.YourTable OFF;

重要规则:同一时间内,数据库中每个会话只能对一个表将 IDENTITY_INSERT 设为 ON。在一个数据库里一次只能对一个表开启。

必须显式列出列名并包含标识列(在 INSERT 列表里)。

操作完成后应及时将其设置回 OFF。

需要相应权限(通常是表的插入权限及更高权限)。

解决方案三:在导入/迁移场景使用其他方法

使用 bcp、SQL Server Integration Services (SSIS) 或 BULK INSERT 时,可能需要额外选项来保留标识值(例如 KEEPIDENTITY)。

在迁移后可重设标识种子值,使新插入的自动生成值不与已有值冲突:

sql

-- 将标识种子设置为当前最大值

DECLARE @maxId INT = (SELECT ISNULL(MAX(Id), 0) FROM YourTable);

DBCC CHECKIDENT ('YourTable', RESEED, @maxId);

常见陷阱与建议

不要忘记在完成后把 IDENTITY_INSERT 设回 OFF,并避免在并发环境中长期打开它以免阻塞其他操作。

若需要插入大量已有 ID(迁移大量数据),建议在单独的维护窗口进行并小心处理主键冲突与外键关系。

对于应用层,尽量不要依赖显式插入标识列,除非有充分理由。


该文章在 2025/10/9 15:22:11 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved