欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » SQLServer教程 » 正文

热门阅读

往自增列插入显式值-SET IDENTITY_INSERT详解

创建时间:2011年08月08日 15:09  阅读次数:(20127)
分享到:
自增列默认是不能插入显式值的,当我们试图给自增列插入值时,会报以下错误:
当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'table1' 中的标识列插入显式值。

如果我们想为表的自增列插入显式值,我们可以通过SET IDENTITY_INSERT语法来实现,这在数据转移的时候尤为有效。
我们先看看IDENTITY_INSERT的语法。
作用:允许将显式值插入表的标识列中。

语法:SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }

参数:
database_name 
指定的表所在的数据库的名称。
schema_name 
表所属的架构的名称。
table 
包含标识列的表的名称。

备注:
任何时候,一个会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设置为 ON,则对另一个表发出 SET IDENTITY_INSERT ON 语句时,SQL Server 2005 将返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON,并报告已将其属性设置为 ON 的表。
如果插入值大于表的当前标识值,则 SQL Server 自动将新插入值作为当前标识值使用。
SET IDENTITY_INSERT 的设置是在执行或运行时设置的,而不是在分析时设置的。


示例:
我们先创建一个带有自增列的表:
create table hr_member(ID int identity(1,1) primary key,name varchar(100))

然后我们尝试往该表插入数据:
insert into hr_member(id,name) values (1,'wfs')

会报以下的错误:
当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'hr_member' 中的标识列插入显式值。

设置identity_insert的值后再插入数据:
set identity_insert hr_member on
insert into hr_member(id,name) values (1,'wfs')
执行成功!

注意:在同一个会话中,只能有一个表的identity_insert可以设置为ON。
我们再创建另一个表:
create table hr_member_1(ID int identity(1,1) primary key,name varchar(100))

然后执行:
set identity_insert hr_member on
set identity_insert hr_member_1 on

会报以下的错误:
表 'test.dbo.hr_member' 的 IDENTITY_INSERT 已经为 ON。无法为表 'hr_member_1' 执行 SET 操作。

修改代码:
set identity_insert hr_member off
set identity_insert hr_member_1 on
执行成功!

注意:我们在在对标识列执行插入操作时,一定要列出此标识列的列名:
如下代码:
set identity_insert hr_member on
insert into hr_member
select 2,'abc'

会报以下错误:
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'hr_member'中的标识列指定显式值。

修改代码:
set identity_insert hr_member on
insert into hr_member(ID,name)
select 2,'abc'
执行成功!

注意:任何set identity_insert 表名 on的设置,都只在当前会话中有效!
会话的定义,请参考本站获取sql server中自增量之scope_identity(),@@Identity,IDENT_CURRENT的区别中对sql会话的解释b
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 56+58=? 的结果(结果是:114)
结  果: