如何自增字段中插入指定值 set IDENTITY_INSERT on 和 off 的设置

本文介绍在 SQL Server 中如何通过设置 IDENTITY_INSERT 来批量插入包含标识列的数据表。具体步骤包括开启标识符插入功能,执行插入操作,并在完成后关闭该功能。

来自:http://www.byywee.com/page/M0/S443/443572.html

sqlserver 批量插入记录时,对有标识列的字段要设置 set IDENTITY_INSERT 表名 on,然后再执行插入记录操作;插入完毕后恢复为 off 设置

格式:
  set IDENTITY_INSERT 表名 on
  set IDENTITY_INSERT 表名 off


举例:

set IDENTITY_INSERT peoplePworkpositiontype  on
insert peoplePworkpositiontype(id,workpositiontype,workpositiontypeid) values(1 , "平台" , 1 )
insert peoplePworkpositiontype(id,workpositiontype,workpositiontypeid) values(2 , "陆地" , 2 )
insert peoplePworkpositiontype(id,workpositiontype,workpositiontypeid) values(3 , "海上" , 3 )

go
set IDENTITY_INSERT peoplePworkpositiontype  off


set IDENTITY_INSERT peoplePstatetype  on
insert peoplePstatetype(id,nowstatetype,nowstatetypeid) values(1 , "出海" , 1 )
insert peoplePstatetype(id,nowstatetype,nowstatetypeid) values(2 , "出差" , 2 )
insert peoplePstatetype(id,nowstatetype,nowstatetypeid) values(3 , "公司" , 3 )
insert peoplePstatetype(id,nowstatetype,nowstatetypeid) values(4 , "会议" , 4 )
go
set IDENTITY_INSERT peoplePstatetype  off
go

<think>好的,我现在需要帮助用户解决在SQL Server中如何使用SET IDENTITY_INSERT来对自列赋值的问题。用户已经提到了一些达梦数据库的情况,但用户现在的问题是关于SQL Server的,所以我需要将重点转移到SQL Server上,同时参考用户提供的引用内容中的相关信息。 首先,我需要确认用户的需求:他们想在定列列表的情况下,开启IDENTITY_INSERT插入列的值。用户可能遇到了在插入数据时报错的问题,需要正确的操作步骤。 接下来,我应该回忆SQL Server中SET IDENTITY_INSERT的用法。根据已有的知识,SQL Server中要手动插入列的值,必须满足两个条件:一是使用SET IDENTITY_INSERT 表名 ON;二是在INSERT语句中明确定列名。这一点达梦数据库类似,但需要确认是否有其他细节差异。 用户提供的引用中,例如引用[1]提到在达梦中需要同时开启IDENTITY_INSERT定列列表,而引用[5]则出在达梦中必须标注所有字段,否则仍会报错。这可能在SQL Server中也是类似的,需要明确列名。 然后,我需要组织步骤。正确的步骤应该是:先开启IDENTITY_INSERT,然后执行带有明确列列表的INSERT语句,最后关闭IDENTITY_INSERT。同时需要注意,每个表在同一会话中只能有一个IDENTITY_INSERT设置ON,并且操作需要权限。 可能还需要提到注意事项,比如权限问题,自列的值是否重复,以及使用场景,比如数据迁移或修复数据时需要手动定自值。 此外,用户可能想知道为什么需要这些步骤,所以需要解释自列通常由数据库自动管理,手动插入时需要显式启用设置,并确保列名正确定,以避免错误。 最后,生成相关问题,帮助用户进一步理解,比如如何避免主键冲突,与达梦数据库的区别,以及是否影响自机制等。</think>在 SQL Server 中通过 $SET\ IDENTITY\_INSERT$ 对自列赋值的步骤如下: ### 操作步骤 1. **启用标识列插入权限** ```sql SET IDENTITY_INSERT 表名 ON; -- 开启当前表自列的手动赋值权限[^1] ``` 2. **执行带列列表的 INSERT 语句** ```sql INSERT INTO 表名 (自列名, 列2, 列3) -- 必须显式定所有插入列名[^2][^5] VALUES (手动值, 值2, 值3); ``` 3. **关闭标识列插入权限** ```sql SET IDENTITY_INSERT 表名 OFF; -- 恢复自列的自动生成特性[^1] ``` ### 核心要求 - **会话级控制**:$SET\ IDENTITY\_INSERT$ 仅对当前数据库连接会话有效[^3] - **独占性限制**:同一会话中只能有一个表的 $IDENTITY\_INSERT$ 处于 ON 状态 - **字段完整性**:INSERT 语句必须显式列出所有插入字段名,包括自列[^5] ### 典型应用场景 1. 数据迁移时保留原系统主键值 2. 修复因删除记录导致的自序列断层 3. 同步不同数据库间的关联数据 $$ \begin{aligned} \text{自列默认行为} &: \text{DB自动赋值} \\ \text{手动插入时} &: \text{需显式开启权限 + 完整列声明} \end{aligned} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值